Windowのプロパティとしてのjavascript関数、名前[duplicate]で定義された関数の違いは何ですか

StackOverflow https://stackoverflow.com//questions/21013025

質問

の違いは何ですか

function doStuff(){
    //do lots of fun stuff
}

window.doStuff = function(){
    //do lots of fun stuff
}

もしあれば?

役に立ちましたか?

解決

最初のものは、現在のスコープコンテキストでdoStuff関数プロパティを作成します。それがwindow(またはスコープが定義されていない)の場合、結果は2番目のものと同じになります ブラウザのコンテキストで.ただし、現在のスコープがたとえば別の関数内にある場合は、ローカルで使用可能な関数のみが作成され、効果は下部と同じではありません。

他のヒント

グローバルスコープで関数を宣言しても大きな違いはありません。関数を宣言しているコードのスコープがグローバルでない場合、違いが表示されます。たとえば、別の関数内で:

function doGlobalStuff()
{
    function doStuff(){
    // do lots of fun stuff
    }
}

DoGlobalStuff()関数を実行すると、ウィンドウオブジェクトにはdoGlobalStuff()メソッドが含まれますが、そこにはDoGlobalStuff()メソッドはありません。ただし、この関数はウィンドウオブジェクトにメソッドdoStuff()を作成します:

function doGlobalStuff()
{
    window.doStuff = function(){
    // do lots of fun stuff
    }
}

次のような詳細については、変数と関数のスコープを検索してください:JavaScriptの変数の範囲は何ですか?

最初のものがグローバルスコープで宣言されている限り、これら2つの間に違いはありません。

最初のものはブラウザのコンテキストから動作します。 window 利用できません。また、(割り当てられている変数またはメソッドキーに関係なく)名前もあり、特にスタックトレースや再帰に役立ちます。

第二は、例えば、ノードでは動作しません。js(ただし global となる)。それはそれ自身の名前を持っていないので、次の例のように再帰を困難にします:

window.doStuff = function( i ){
    if( --i ){
        return window.doStuff();
    }

    return i;
}

ウィンドウの場合。doStuffは、次のように他の何かを割り当てられます…

window.doStuff = 'erg';

...それは匿名であり、それ自体を参照することができないので、上記の関数は壊れます—それは本質的に失われます。

もちろん、あなたが両方をするのを止めるものは何もありません:

window.doStuff = function doStuff(){
    //do lots of fun stuff
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top