6

Chrome Dev Consoleでいくつかの js コードをテストしましたが、少し混乱しています。

このキーワードを参照したときにオブジェクトのメソッドではない厳密モードの関数は、グローバルオブジェクトではなく未定義を受け取る必要があることを私は知っています。

function test(){
    "use strict";
    return this===undefined;}
test(); 

falseを出力します。

"use strict";
function test(){
    return this===undefined;}
test(); 

まだです。

(function test(){
    "use strict";
    return this===undefined;}());

trueを出力します。

明確にしたかっただけです。ʕ •ᴥ•ʔ 私は js が初めてです。

4

3 に答える 3

3

お気付きの点は、開発者コンソールの動作の単なる副作用です。そこにコードを入力すると、実際には次のようになります (詳細については、この回答を参照してください)。

eval.call(null, "with (window) { \
                     function test() { \
                         'use strict'; \
                         console.log(this); \
                     } test(); \
                 }");

これは への間接的な呼び出しevalです。つまり、常にグローバル実行コンテキスト (ブラウザではwindow) で実行されます。

事実上、関数はグローバル オブジェクトにバインドされているため、this(コンソールではなく) Web ページで行ったかのように、グローバル オブジェクトへの参照を保持します。

function test(){
    "use strict";
    return this === undefined;
}

test(); // true
test.call(window); // false
于 2013-02-28T12:38:40.933 に答える
1

this依然としてグローバル オブジェクトを参照する原因となる Chromium 開発者コンソールのバグです。同じコードjavascript:が、ロケーション バーやドキュメントで指定されたとおりに機能します。

次のようにテストできます (2 つのコンソール入力):

var global = (function () { return this; }());

"use strict";
function test () { return this === global; }
test();

および (1 つ以上のコンソール入力)

var script = document.createElement("script");
script.type = "text/javascript";
script.appendChild(document.createTextNode(
  'function test () { "use strict"; return this === undefined; }; console.log(test());'
));
document.body.appendChild(script);

Chromium バージョン 25.0.1364.97 Debian 7.0 (183676) でテスト済み。

于 2013-02-28T12:39:54.090 に答える
1

すべて順調。(開発コンソールではなく) HTML ページを介してコードを実行すると、結果は期待どおりになります (常にthis===undefined)。

さらに、最新の Firefox (Firebug) では:

function test(){
    "use strict";
    return this===undefined;}
test(); 
>> true

したがって、これは単なる別の Chrome のバグ (機能?) のようです。開発コンソール経由で渡されるコードに対して、少し異なるアプローチをしているように感じます。

また、順序が重要であることに注意してください。

<script>
    console.log( 'Me First!' );

    "use strict";

    function test(){
        console.log( this );
    }
    test();

</script>

>>> "Me First!"
>>> Window {top: Window, window: Window, location: Location, external: Object, chrome: Object…}

しかし:

<script>
    "use strict";

    console.log( 'Me later!' );

    function test(){
        console.log( this );
    }
    test();

</script>

>>> undefined
>>> "Me later!"
于 2013-02-28T12:33:00.220 に答える