this 谁调用就是谁
var name = 'a';
var obj = {
name: 'b',
getName: function() {
console.log(this.name);
}
};
obj.getName(); //b
var getName = obj.getName;
getName(); //a
var obj2 = (function() {
return function() {
console.log(this.name);
}
})();
obj2(); //a
obj.getName()调用getName的是obj,此时this指向的是obj,所以打印的是b
而调用getName()的是window,此时this指向的是window.所以打印的是a
obj2()里面用到了立即执行函数,返回的是一个函数,而调用的也是window,this指向的是window
var length = 10;
function fn() {
console.log(this.length);
}
var obj3 = {
method: function(fn) {
fn();
arguments[0]();
}
};
obj3.method(fn, 1);//10 2
虽然在程序执行时,使用了obj3.method方法,让this指向了obj3,但是真正的函数执行在函数体内部,也即当fn()执行的时候,this是指向window的,所以第一次执行结果是10
分析下在method(fn,1)执行时,经历了什么: 首先两个参数fn和1会被放入arguments中,在arguments中第一个参数就是我们传入的函数;接下来fn执行,此时this没有绑定因此指向window,输出10。 然而到了arguments0这一句,相当于把arguments[0]中的第一个参数拿来执行, 效果如下:
arguments0执行,等同于arguments.0()
这样我们可以更清楚知道,this是指向arguments实例本身
复制代码arguments.length就是它本身的长度(arguments是一个类数组,具有length属性),因此输出2
网友评论