4

このエラーを修正する方法は知っていますが、このエラーが発生する理由の包括的な説明を教えてくれる人はいますか?

var fn = function () {
  return fn();
}(); //uncaught TypeError: Property 'fn' of object [object DOMWindow] is not a function
4

4 に答える 4

3

グローバル スコープで 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
于 2011-09-11T12:09:38.793 に答える
2
var fn = function () {
  return fn();
}();
  1. 上記のコードは可変ステートメントです。変数fnは、私が設定した値として宣言されていますundefined(今のところ)。

  2. function () {}()IIFEです。IIFEは、すぐに呼び出される関数です。

  3. そのIIFEには、1つのステートメント(ステートメント)が含まれていますreturn。IIFEが呼び出されたため、そのreturnステートメントはすぐに実行されます。

  4. そのreturnステートメントには、次の式が含まれています。-これfn()は関数の呼び出しです。しかしfn、現時点では何ですか?関数ですか?いいえ、まだundefinedです。値を呼び出すundefinedとエラーがスローされます。


私はあなたがおそらくこのパターンを達成したいと思うと思います:

var fn = (function () {

    var private = 0;

    function utility() { ... }

    return function () { ... };

})();

さて、は変数とプライベート関数fnに排他的にアクセスできる関数です。privateutility

于 2011-09-11T12:11:03.813 に答える
1

あなたが言っているのは

  1. 関数を実行するfunction () { return fn(); }
  2. 返された値を変数に格納するfn

もちろん、問題は、#1 が発生したとき、fnまだ定義されていないため、関数呼び出しで使用できないことです。fn機能ではありません。「X の値を X の値に設定する」と言っているのと同じで、意味がありません。

あなたが実際にを呼び出した結果fnを返そうとしていることを除いて、これはさらに意味がありません。したがってfn、まだ定義されていないことについてどういうわけか文句を言わなかったとしても、関数呼び出しが返された値の返された値の返された値を返すという無限再帰が発生します...<br> Shef が言うように、それが呼び出されますスタック オーバーフロー エラー

于 2011-09-11T11:57:48.867 に答える
-2
var fn = function () {
  return this;
}();

変数型の関数定義が他のコードの前に精緻化されていないため、それを書くことはできません。あなたがやろうとしていることに加えて、意味がありません。次のような関数を作成できます。

function fn(){
    return fn();
}

fn();

しかし、あなたはstack_overflowエラーにぶつかるでしょう。

于 2011-09-11T10:41:49.123 に答える