在JavaScript中,this
关键字用于访问其中调用函数的context
。除非在当前作用域中设置了'use strict'
标志,否则无论是使用.methodName()
语法还是使用.methodName()
语法调用它们,都始终使用上下文调用JavaScript中的函数。
当一个函数被没有像这样的上下文中调用:
myFunction()
上下文由运行时假定为全局窗口对象(除非'use strict'
标志被设置,在这种情况下,上下文将是未定义。)
注意:在使用ES6和Babel等转译器时,默认情况下会在输出中设置严格模式。
当一个函数的引用保存在一个对象上时,可以使用点语法将对象作为'this'的上下文来调用该函数。
var myObj = {
myFunc: function(){}
};
// myFunc invoked like this, the value of 'this' inside myFunc will be myObj.
myObj.myFunc();
操纵“这个”:
呼叫和应用
您可以随时通过与.CALL或方法。适用调用它改变功能的情况下。在这种情况下,你有一个匿名函数,它不会被你调用,而是被setTimeout函数调用。因此,您将无法利用.call或.apply的优势。
绑定
相反,你可以创建一个具有使用.bind方法的自定义上下文一个新的功能。通过在匿名函数上调用.bind(),将返回一个新的函数,该函数将自定义上下文绑定到“this”。这样,您可以将自定义绑定函数作为数据传递给setTimeout。
setTimeout(function(){
// your code.
}.bind(this), 1000);
现在里面的匿名函数里'this'关键字会被绑定到正确的值。
词汇 '这个':
在ES6然而,使用箭头功能大约 '这个' 变化的规则时。如果你使用这个语法,你会看到'this'的上下文将保持与当前范围内的任何内容相同。
setTimeout(() => {
// Hey I can access 'this' in here!
}, 1000);
保存参考:
如果你看一下编译后的输出从巴别塔,你会看到巴贝尔通过保存引用到“本”与_this1,_this2等等跟踪上下文。
要使用此方法自己只是声明了一个新的变量(这是通常使用“是”或“自我”),并使用它访问值的匿名函数里面,像这样:
var self = this;
setTimeout(function(){
self.http.post...
});
希望这有助于。
更多解释developer.mozilla.org有good article describing the behavior of 'this' inside a functions scope。
这是因为'这个'上下文:http://stackoverflow.com/questions/2130241/pass-correct-this-context-to-settimeout-callback – nikoskip
我们真的需要4个答案,这个问题基本上都是这样说的“使用箭头函数来获得正确的'this' context”? –
@MarkRajcok是的,有3个答案是不够的! –