这是偶然在一次调试中JavaScript发现的问题,把某个对象下的function传入某个函数,然后函数内再调用function,然而这样会导致被传入的function this指向有问题
var F = function (name) {
this.name = name;
};
F.prototype.getName = function () {
return this.name;
};
var f = new F('琼台博客');
var dosome = function (fun) {
if (typeof fun === 'function') {
return fun();
}
};
f.getName(); // 琼台博客
dosome(f.getName); // undefined
dosome.apply(f, [f.getName]); // undefined
这个示例代码充分说明了几点
- function里的this一般指被调用者
- 然而第三个的执行结果似乎打乱了这点说明,虽然dosome此时的this已指向f实例,但getName还是会把this当做window处理,结果返回undefined
其实,上面的代码跟下面的有点类似
var f = {
name: '琼台博客',
getName: function () {
return this.name;
}
};
var dosome = function (fun) {
if (typeof fun === 'function') {
return fun();
}
};
f.getName(); // 琼台博客
dosome(f.getName); // undefined
dosome.apply(f, [f.getName]); // undefined
所以要保持function内的this指向,得保持对象名+方法名调用,执行一个全局方法fun()
相当于window.fun()
,但是闭包内的虽然不能通过window命名空间调用,但某些情况下this仍然能指向window。如果要改变某个函数内的this执行可以使用apply或者call即可。