首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么存储对一个函数的引用,然后调用该函数会导致'this‘有一个window上下文?

为什么存储对一个函数的引用,然后调用该函数会导致'this‘有一个window上下文?
EN

Stack Overflow用户
提问于 2013-02-15 00:07:59
回答 2查看 49关注 0票数 1

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

该网站具有以下代码

代码语言:javascript
复制
function Developer(skill) {
  this.skill = skill;
  this.says = function(){
    alert(this.skill + ' rocks!');
  }
}
var john = new Developer('Ruby');
john.says(); //Ruby rocks!

vs

代码语言:javascript
复制
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!

为什么存储对函数的引用,然后调用该函数会导致该函数的上下文为window?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-15 00:09:46

当你执行

代码语言:javascript
复制
a.b();

那么a就是b (b中的this)的执行上下文,除非b是一个绑定函数。

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

代码语言:javascript
复制
b();

然后它就像是

代码语言:javascript
复制
window.b();

因此,window是执行b的上下文。

还要注意的是

代码语言:javascript
复制
a.b();

等同于

代码语言:javascript
复制
b.call(a);

代码语言:javascript
复制
b();

等同于

代码语言:javascript
复制
b.call(); // call replaces its first argument by the global object if it's null or undefined

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

代码语言:javascript
复制
var func = john.says.bind(john);
func();

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

代码语言:javascript
复制
var func = function(){john.says()};
func();
票数 2
EN

Stack Overflow用户

发布于 2013-02-15 00:17:14

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

当你调用john.says()时,它就像是在做john.says.apply(john)

当你调用func()时,它就像是在做func.apply()

耶胡达·卡茨对"JavaScript function invocation and this“有一个很好的解释。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14879037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档