这和词汇范围

时间:2012-12-04 00:32:26

标签: javascript

this link,Mozilla以下列方式解释了“这个”的内容:

  

通常,当前作用域中绑定到this的对象是   由当前函数的调用方式决定,不能设置   执行期间的分配,每次都可以不同   函数被调用。

在正常情况下,我了解this及其参考资料如何变更。

“Pro JavaScript设计模式”一书中提到了以下关于词法范围的内容

  

JavaScript也是词法范围,这意味着函数运行   它们的定义范围,而不是它们的执行范围   英寸

所以'this'取决于当前函数的调用方式,而词法范围意味着函数在定义它们的范围内运行。

我的问题是,this是否可以成为词法范围的一部分,如果是这样,我如何理解这取决于如何调用当前函数的事实,而词法范围将函数限制为它们的定义范围。

2 个答案:

答案 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(这个)和平来避免它,你可能会处于更好的状态。