8

次の構成では:

(function(){

    var x = function(){
        alert('hi!');
    }

    var y = function(){
        alert("hi again!");
    }

    this.show = function(){
        alert("This is show function!");
    }

})();

オブジェクトthisを参照するのはなぜですか? windowIIFE 内のすべてをグローバル スコープから分離する必要がありますか? xと関数はグローバル オブジェクトyのプロパティでもありますか?window

また、最初に put を使用してもvar h = ...:

var h = (function(){

    var x = function(){
        alert('hi!');
    }

    var y = function(){
        alert("hi again!");
    }

    this.show = function(){
        alert("This is show function!");
    }

})();

thisまだウィンドウ オブジェクトを参照していますshow()。グローバル スコープから呼び出すことができます。どうして?

4

2 に答える 2

11

グローバル コンテキスト (windowブラウザ内) は、this他に使用する値がない場合に取得される値です。

ローカル変数はローカルです (つまり、のプロパティではありませんwindow)。それらは、関数内で宣言されていますvar

追加var h = (function(){...しても違いがない理由は、関数の呼び出し方法にあります。関数参照はオブジェクト ( など) のプロパティ値ではなく、またはでsomething.func()呼び出さないため、これはグローバル ( ) オブジェクトを参照します。それは、言語が動作するように定義されている方法です。.call().apply()window

于 2011-10-04T20:42:02.590 に答える
10

@Pointyは正しいですが、彼は問題全体を提示していません-この関連する回答に興味があるかもしれません. ここでの問題は、newキーワードを使用していない場合、オブジェクトをインスタンス化していないためthis、参照するインスタンスがないことです。インスタンスがない場合はthis、オブジェクトを参照しwindowます。

this一般に、無名関数のスコープで定義された任意の関数または変数に直接アクセスできるため、IIFE 内では必要ありません。直接show()呼び出すことができるため、参照は必要ありません。でIIFEをインスタンス化するための有効なユースケースがあるかもしれませんが、私はそれを見つけたことがありません.x()y()thisnew

于 2011-10-04T21:01:59.723 に答える