このエラーを修正する方法は知っていますが、このエラーが発生する理由の包括的な説明を教えてくれる人はいますか?
var fn = function () {
return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function
このエラーを修正する方法は知っていますが、このエラーが発生する理由の包括的な説明を教えてくれる人はいますか?
var fn = function () {
return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function
グローバル スコープで var キーワードを使用すると、宣言された変数はグローバル オブジェクトのプロパティになります。Web ブラウザでは、グローバル オブジェクトはwindow
オブジェクトであり、それ自体が のインスタンスですDOMWindow()
。したがって、その知識を使用して、コードを次のように書き直すことができます。
window.fn = function () {
return window.fn();
}();
最初の割り当てを取り除くと、次のようになります。
(function () {
return window.fn();
})();
window.fn()
...が呼び出される無名関数を定義します。ただし、このコードが実行される時点でwindow.fn
は、関数ではありません (関数になることはありません)。そのため、内部[[Call]]
フラグがなくても呼び出そうとしているため、例外がスローされます。
無名関数の即時実行を取り除くと、次の関数にwindow.fn
なります。
var fn = function () {
return fn();
}
fn(); //-> infinite loop
var fn = function () {
return fn();
}();
上記のコードは可変ステートメントです。変数fn
は、私が設定した値として宣言されていますundefined
(今のところ)。
function () {}()
IIFEです。IIFEは、すぐに呼び出される関数です。
そのIIFEには、1つのステートメント(ステートメント)が含まれていますreturn
。IIFEが呼び出されたため、そのreturn
ステートメントはすぐに実行されます。
そのreturn
ステートメントには、次の式が含まれています。-これfn()
は関数の呼び出しです。しかしfn
、現時点では何ですか?関数ですか?いいえ、まだundefined
です。値を呼び出すundefined
とエラーがスローされます。
私はあなたがおそらくこのパターンを達成したいと思うと思います:
var fn = (function () {
var private = 0;
function utility() { ... }
return function () { ... };
})();
さて、は変数とプライベート関数fn
に排他的にアクセスできる関数です。private
utility
あなたが言っているのは
function () { return fn(); }
fn
もちろん、問題は、#1 が発生したとき、fn
まだ定義されていないため、関数呼び出しで使用できないことです。fn
機能ではありません。「X の値を X の値に設定する」と言っているのと同じで、意味がありません。
あなたが実際にを呼び出した結果fn
を返そうとしていることを除いて、これはさらに意味がありません。したがってfn
、まだ定義されていないことについてどういうわけか文句を言わなかったとしても、関数呼び出しが返された値の返された値の返された値を返すという無限再帰が発生します...<br> Shef が言うように、それが呼び出されますスタック オーバーフロー エラー
var fn = function () {
return this;
}();
変数型の関数定義が他のコードの前に精緻化されていないため、それを書くことはできません。あなたがやろうとしていることに加えて、意味がありません。次のような関数を作成できます。
function fn(){
return fn();
}
fn();
しかし、あなたはstack_overflow
エラーにぶつかるでしょう。