Windowのプロパティとしてのjavascript関数、名前[duplicate]で定義された関数の違いは何ですか
-
21-12-2019 - |
質問
の違いは何ですか
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
}