1

JavaScript Enlightenment (リンクは公開前のバージョン (85 ページ) へのリンクですが、私は公開バージョン (第 6.3 章) を持っていますが、同じことを言っています) では、内部関数はすべてthisグローバル オブジェクトとして扱われると書かれています。 ( window) ECMA-3 では修正されましたが、ECMA-5 では修正される予定です。

コードは以下のとおりです。

http://jsfiddle.net/javascriptenlightenment/9GJhu/

var myObject = {
    func1: function() {
        console.log(this); // logs myObject
        var func2 = function() {
            console.log(this) // logs window, and will do so from this point on
            var func3 = function() {
                console.log(this); // logs window, as it’s the head object
            }();
        }();
    }  
}

myObject.func1();

しかし、現在の Chrome、Firefox、および node.js は ECMA-5 を大幅に実装する必要があると考えたので、それらで上記のコードを試してみましたが、依然としてfunc2および内のグローバル オブジェクトが出力されますfunc3。次に、念のため、and にも追加"use strict";しました。コード: http://jsfiddle.net/9GJhu/6/ Chrome と node.js では、はではなくとして出力されます。したがって、本によると、ECMA-5にあるはずです。上記のコードで何が間違っていますか?func1func2func3thisundefinedmyObjectthismyObject

4

3 に答える 3

2

私は間違っているかもしれませんが、その本が何を意味しているのか、仕様のどこにも見ていません。ECMAScript5.1仕様
に準拠10.4.3機能コードの入力

  1. 関数コードが厳密なコードである場合は、ThisBindingをthisArgに設定します。
  2. それ以外の場合、thisArgがnullまたは未定義の場合は、ThisBindingをグローバルオブジェクトに設定します。
  3. それ以外の場合、Type(thisArg)がObjectでない場合は、ThisBindingをToObject(thisArg)に設定します。
  4. それ以外の場合は、ThisBindingをthisArgに設定します。
  5. localEnvを、引数としてFの[[Scope]]内部プロパティの値を渡してNewDeclarativeEnvironmentを呼び出した結果とします。
  6. LexicalEnvironmentをlocalEnvに設定します。
  7. VariableEnvironmentをlocalEnvに設定します。
  8. codeをFの[[Code]]内部プロパティの値とします。
  9. 10.5で説明されているように、関数コードコードとargumentsListを使用して、宣言バインディングのインスタンス化を実行します。

(1.)によると、func2func3にはコンテキストがなく、指定strict modeしたコンテキストはに設定されundefinedます。なしstrict modeおよび(2.)によると、thisに設定されwindowます。

于 2013-03-06T08:10:37.193 に答える
1

'use strict'ディレクティブを使用する場合、'this'キーワードはデフォルトで'undefined'ですが、非strictモードでは'this'キーワードはデフォルトでグローバルオブジェクトを参照します。コンテキストを明示的に指定する必要があります。

ちなみに、「usestrict」を宣言する必要があるのは1回だけです。

于 2013-03-06T08:11:33.547 に答える
0

関数がネストされているという事実は、何の意味もありません。ネストされていない場合も同じように機能し続けます。

var myObject = {
    func1: function() {
        console.log(this); // logs myObject
    }  
}
myObject.func1();

var func2 = function() {
    console.log(this) // logs window, and will do so from this point on
}();

var func3 = function() {
    console.log(this); // logs window, as it’s the head object
}();

http://jsfiddle.net/NYr3y/2/

var myObject = {
    func1: function() {
        "use strict";

        console.log(this); // logs myObject
    }  
}

myObject.func1();


var func2 = function() {
    "use strict";

    console.log(this) // logs window, and will do so from this point on

}();

var func3 = function() {
    "use strict";

    console.log(this); // logs window, as it’s the head object
}();

http://jsfiddle.net/4B84u/2/

最初の関数は(メソッドとして)コンテキストを使用して呼び出されるため、「this」はmyObjectです。

他の関数は(のようにfunc2())コンテキストなしで呼び出されます。この場合、ECMA-5は、これを介してグローバルオブジェクトへの明示的な参照を許可しません。

ほとんどのブラウザは、より制限が厳しいため下位互換性がないため、デフォルトではECMA-5を適用しません。

于 2013-03-06T08:34:45.563 に答える