Hot For Coding
关于JavaScript this指向问题

这是偶然在一次调试中JavaScript发现的问题,把某个对象下的function传入某个函数,然后函数内再调用function,然而这样会导致被传入的function this指向有问题

var F = function (name) {
  this.name = name; 
};
 
F.prototype.getName = function () {
  return this.name;
};
 
var f = new F('Nicholas Lee');
 
var dosome = function (fun) {
  if (typeof fun === 'function') {
    return fun();
  }
};
 
f.getName();                    // Nicholas Lee
dosome(f.getName);              // undefined
dosome.apply(f, [f.getName]);   // undefined

这个示例代码充分说明了几点

  • function里的this一般指被调用者
  • 然而第三个的执行结果似乎打乱了这点说明,虽然dosome此时的this已指向f实例,但getName还是会把this当做window处理,结果返回undefined

其实,上面的代码跟下面的有点类似

var f = {
  name: 'Nicholas Lee',
  getName: function () {
    return this.name;
  }
};
 
var dosome = function (fun) {
  if (typeof fun === 'function') {
    return fun();
  }
};
 
f.getName();                    // Nicholas Lee
dosome(f.getName);              // undefined
dosome.apply(f, [f.getName]);   // undefined

所以要保持function内的this指向,得保持对象名+方法名调用,执行一个全局方法fun()相当于window.fun(),但是闭包内的虽然不能通过window命名空间调用,但某些情况下this仍然能指向window。如果要改变某个函数内的this执行可以使用apply或者call即可。

TITLE: 关于JavaScript this指向问题

LINK: https://www.qttc.net/438_javascript_this.html

NOTE: 转载内容请注明出处