4

後でグローバル変数 x を介してアクセスされ、「モジュール」のように動作する即時関数内にコードをカプセル化しようとしています。

コード:

var x = (function () {

    console.log(x); // undefined
    console.log(this); // undefined

})();

thisしかし、関数自体を参照するために使用できない理由がわかりません。

編集:

即時関数は厳密モードの別の関数内にあります( "use strict")

4

5 に答える 5

1

関数が関数内で実行されるか、厳密モードで処理される別の関数へのコールバックとして渡されると、面白いことが起こります。

ここにデモがあります。コンソールを見てください

function foo(){
    'use strict';

    (function(){
        //undefined in strict mode
        console.log('in foo, this is: '+this);  
    }());

}

function bar(){

    (function(){
        //DOMWindow when NOT in strict mode
        console.log('in bar, this is: '+this); 
    }());

}

foo();
bar();​

したがって、そのコードが厳密モードの別の関数内でコールバックとして実行される場合、thisは global を参照せずwindow、むしろ になりますundefined

于 2012-04-12T09:29:50.850 に答える
0

自己実行関数 (即時関数) は、実行時の実行コンテキストのみを提供します。コードでは即時関数の結果が割り当てられ、何も返さないため、 x は未定義であるため、 x は常に未定義になります。

これは未定義であってはなりません。無名関数では DOMWindow オブジェクトを参照します。表示されている未定義は、無名関数の結果にすぎません。

「モジュール」またはクラスのような動作が必要な場合は、

var x = function() {
console.log(x, this);
};

xaコンストラクターを作成するのと同じように行い、プロトタイププロパティを使用して継承したいプロパティでオブジェクトを拡張できます。

x.prototype.foo = function() {

}
于 2012-04-12T09:20:28.403 に答える
0

「this」を使用して関数自体を参照することはできません。「this」は、オブジェクト内のオブジェクトのインスタンスを指します。

于 2012-04-12T09:17:32.507 に答える
0

this関数の所有者です。関数そのものではありません。

ところで、あなたが報告した出力は間違っています:

console.log(this); // DOMWindow

デモ

これは、 の所有者がimmediate functionGlobal-Object -であるためwindowです。

コメントしthisたように、常にオブジェクトである必要はありませんが、DOMWindow決してオブジェクトになることはできませんundefined!

于 2012-04-12T09:17:33.707 に答える
0

this即時 anon 関数内では使用しないでください。意味がありません。this作成されたオブジェクトを後で使用することを提案し、即時関数には反対の目的があります-実行直後に名前空間を破棄します。あなたの例thisでは、グローバルオブジェクト、ウィンドウを参照します。

于 2012-04-12T09:29:31.877 に答える