3

这个链接上,Mozilla 通过以下方式解释了“this”引用的内容:

一般来说,this当前作用域内绑定的对象是由当前函数的调用方式决定的,不能在执行时通过赋值来设置,每次调用函数时都可以不同。

在正常情况下,我理解this它的引用是如何变化的。

这本书 Pro JavaScript Design Patterns 说以下关于词法范围

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

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

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

4

2 回答 2

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永远不会从词法范围中获取,而是始终根据调用分配一个值。

作品中有一个新的函数语法,可能会有一个 lexical this,但那是将来的某个时候。

于 2012-12-04T00:38:14.287 回答
2

ES6 箭头函数声明语法改变了 Javascript 的 'this' 绑定规则,因此 'this' 始终指代词法上下文,而不是根据函数的调用方式而改变。

这定义了“this”的词法范围......

var myFunc = () => {
  // function contents here
}

上面的箭头函数声明语法将“this”绑定重新定义为“lexical this”。不过要小心,有充分的理由不要通过使用“this”来混淆问题,因为代码中有两组不同的绑定规则。如果您可以通过与 .bind(this) 和平相处来避免它,那么您的状态可能会更好。

于 2014-06-29T23:32:11.757 回答