3

このリンクで、Mozilla は「これ」が参照するものを次のように説明しています。

一般に、現在のスコープにバインドされているオブジェクト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、レキシカル スコープから取得されることはありませんが、呼び出しに基づいて常に値が割り当てられます。

おそらくレキシカルを持つ新しい関数構文がありますが、thisそれは将来のいつかです。

于 2012-12-04T00:38:14.287 に答える
2

ES6 アロー関数宣言構文は、Javascript の 'this' バインディング ルールを変更して、'this' が関数の呼び出し方法に応じて変化するのではなく、常に字句コンテキストを参照するようにします。

これは、'this' のレキシカル スコープを定義します...

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

上記のアロー関数宣言構文は、「レキシカル this」への「this」バインディングを再定義します。ただし、コード内に 2 つの異なるバインディング ルール セットが存在するような方法で「this」を使用することによって、問題を混同しない十分な理由があることに注意してください。.bind(this) と和解することでそれを回避できる場合は、おそらくより良い形になっています。

于 2014-06-29T23:32:11.757 に答える