1

我正在阅读教程,以便了解 _.bind 和 _bindAll:http ://blog.bigbinary.com/2011/08/18/understanding-bind-and-bindall-in-backbone.html

该网站有以下代码

function Developer(skill) {
  this.skill = skill;
  this.says = function(){
    alert(this.skill + ' rocks!');
  }
}
var john = new Developer('Ruby');
john.says(); //Ruby rocks!

对比

function Developer(skill) {
  this.skill = skill;
  this.says = function(){
    alert(this.skill + ' rocks!');
  }
}
var john = new Developer('Ruby');
var func = john.says;
func();// undefined rocks!

为什么存储对函数的引用然后调用该函数会导致 this 具有窗口上下文?

4

2 回答 2

2

当你执行

a.b();

thenab( thisinside b) 的执行上下文,除非b是绑定函数。

如果你没有a,那就是如果你有

b();

那么它和

window.b();

window执行的上下文也是如此b

另请注意

a.b();

是相同的

b.call(a);

b();

是相同的

b.call(); // call replaces its first argument by the global object if it's null or undefined

如果你想绑定上下文,那么你可以(在现代浏览器上)

var func = john.says.bind(john);
func();

或者(更经典地)使用闭包:

var func = function(){john.says()};
func();
于 2013-02-14T16:09:45.830 回答
2

因为“this”关键字是在调用时绑定的,而不是定义时。

当你打电话john.says()时,就像在做john.says.apply(john).

当你打电话func()时,就像在做func.apply().

Yehuda Katz 对“ JavaScript 函数调用和this”有很好的解释。

于 2013-02-14T16:17:14.027 回答