var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn1) {
console.log(arguments[0]()); }
};
obj.method(fn, 123);//输出2
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn1) {
console.log(fn1()); }
};
obj.method(fn, 123);//输出10
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn1) {
console.log(fn1===arguments[0]); }
};
obj.method(fn, 123);//输出true
我想问一下,上面两个代码this指向怎么理解?
第一个代码this.length应该是函数参数的个数;这个是为啥?
第二个代码this.length应该是指向全局变量length,这个this为什么不指向obj呢?是obj调用的呀?
this 有三个指向: 没有对象调用方法时候 this 指向全局就是window
有对象低调用时 指向那个调用的对象 如果函数碰到new 关键字 那this 就指向 new
前边的对象
第一个
var length=10
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn1) {
console.log(arguments[0]()); }
};
obj.method(fn, 123);//输出2
obj.method( ) 执行方法 输出console
arguments 代表的是函数的实参的集合 所以 arguments===[fn,123]
arguments[0] === fn
arguments0 ==== fn() 所以外边的函数就执行了 这是后参照this的三个指向 谁调用的fn是arguments
因为arguments执行的自己第一个参数所以调用的 所以此时 this 执行 arguments this.length 就是arguments的长度 也就是实参的个数2个
如果obj.method(fn, 123,123)那就是3了
第二个
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length: 5,
method: function (fn1) {
console.log(fn1()); }
};
obj.method(fn, 123);//输出10
第二个是fn1()执行 根据参数对应 fn1 == fn fn1() == fn()
此时没有对象让fn() 是自己执行的 所以参照this的3个指向 没有对象调用时指向window 也就是全局
而 var length = 10; 实际相当于 window.length = 10 因为window 是顶层对象所以省略了 所以此处是10
第一个地方自然是指的是函数的参数,因为this.length,这里只有全局变量length,和当前函数的局部变量length
第二个obj.method(fn, 123);此时fn是作为回调函数,它并不是闭包,所以它的变量作用域没有改变,并不会是object,如果你用箭头函数,就不同了。
var obj = {
length: 5,
method: function (fn1) {
console.log(arguments[0]()); }
};
第一段代码中对象obj的方法method中,虽然声明了形参fn1,但是实际打印中是通过arguements[0]调用,虽然此时fn1 === arguements[0] === fn,但是调用的对象是arguements而不是fn指向的this(即window)。
第二段代码中对象obj的方法method中,声明了形参fn1,打印也是直接调用fn1() === fn() 执行,而非通过obj.fn()。所以这时函数fn1的this指向window。
可以在fn代码块内加上console.log(this)
有意思的是虽然第二段代码this指向window,但打印的值却是0
fn是全局函数,不管谁掉用它都是全局函数,所以this就是全局的this。
this指向的永远是定义时候对应的this,不会在运行时根据调用顺序自动绑定,那样就乱套了。