在this link,Mozilla以下列方式解释了“这个”的内容:
通常,当前作用域中绑定到
this
的对象是 由当前函数的调用方式决定,不能设置 执行期间的分配,每次都可以不同 函数被调用。
在正常情况下,我了解this
及其参考资料如何变更。
“Pro JavaScript设计模式”一书中提到了以下关于词法范围的内容
JavaScript也是词法范围,这意味着函数运行 它们的定义范围,而不是它们的执行范围 英寸
所以'this'取决于当前函数的调用方式,而词法范围意味着函数在定义它们的范围内运行。
我的问题是,this
是否可以成为词法范围的一部分,如果是这样,我如何理解这取决于如何调用当前函数的事实,而词法范围将函数限制为它们的定义范围。
答案 0 :(得分:6)
将它们视为单独的问题。
函数的变量范围永远不会改变。
this
的值会根据调用函数的方式而改变。给定相同的函数,不同的调用为同一函数提供不同的this
。
var foo = (function() {
var bar = "bar";
return function() { console.log(bar, this); };
})();
foo(); // the default `this`
var someObj = {some: "object"};
foo.call(someObj); // `this` is someObj
var aDiffObj = {aDiff: "object"};
foo.apply(aDiffObj); // `this` is aDiffObj
var anotherObj = {another: "object", foo:foo};
anotherObj.foo(); // `this` is anotherObj
var binderObj = {binder: "object"};
var bound = foo.bind(binderObj);
bound(); // `this` is binderObj
new foo(); // `this` is a new object being constructed,
// which has the prototype of `foo` in its prototype chain
所有调用都可以访问bar
变量,但可以使用不同的this
值。
因此,给定ECMAScript中的当前函数语法,this
将永远不会从词法范围中获取,但始终会根据调用分配一个值。
在作品中有一个新的函数语法可能会有一个词汇this
,但这是将来的某个时候。
答案 1 :(得分:2)
ES6箭头函数声明语法更改Javascript的'this'绑定规则,以便'this'始终引用词法上下文,而不是根据函数的调用方式而改变。
这定义了'this'的词法范围......
var myFunc = () => {
// function contents here
}
上面的箭头函数声明语法重新定义了'this'绑定到'lexical this'。但是要小心,有充分的理由不要通过使用“this”来混淆问题,使得代码中有两组不同的绑定规则。如果你可以通过与.bind(这个)和平来避免它,你可能会处于更好的状态。