Javascript 这与词汇范围有关

Javascript 这与词汇范围有关,javascript,Javascript,在上,Mozilla以以下方式解释了“this”引用的内容: 通常,当前范围内绑定到此的对象是 由当前函数的调用方式决定,不能通过 执行过程中的赋值,每次 函数被调用 在正常情况下,我理解这个以及它的引用是如何变化的 projavascript设计模式一书介绍了以下关于词法范围的内容 JavaScript也是词汇范围的,这意味着函数在 定义它们的范围,而不是执行它们的范围 在 所以“这”取决于当前函数的调用方式,而词法作用域意味着函数在定义它们的作用域中运行 我的问题是,this是否可以成为词法

在上,Mozilla以以下方式解释了“this”引用的内容:

通常,当前范围内绑定到此的对象是 由当前函数的调用方式决定,不能通过 执行过程中的赋值,每次 函数被调用

在正常情况下,我理解
这个
以及它的引用是如何变化的

projavascript设计模式一书介绍了以下关于词法范围的内容

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

所以“这”取决于当前函数的调用方式,而词法作用域意味着函数在定义它们的作用域中运行


我的问题是,
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
    变量,但该
    值不同

因此,给定ECMAScript中当前的函数语法,
这个
将永远不会从词法范围中获取,而是将始终根据调用分配一个值


有一个新的函数语法正在开发中,它可能会有一个词法
this
,但那是将来的某个时候。

ES6 arrow函数声明语法改变了Javascript的“this”绑定规则,因此“this”总是指词法上下文,而不是根据调用函数的方式而改变

这定义了“This”的词法范围

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

上面的arrow函数声明语法将“this”绑定重新定义为“词法this”。不过,请小心,使用“this”时,代码中有两组不同的绑定规则,因此有充分的理由不要混淆这个问题。如果你能通过与.bind(这个)和好来避免它,你的状态可能会更好。

别忘了
bind
!(虽然有点不同)@Ian:啊,是的,忘了那个。我会更新@@acjohnson55和
新的
太多了。@acjohnson55哈哈文本复印机@伊恩,这是对你的文本的无尘室重新实现:)+1,但我会比“将它们视为单独的关注点”更进一步,范围和这是完全不同的概念。