0

誰かが説明したり、理由を教えてくれるリソースへのリンクを教えてください:

<script type=" type="text/javascript">

    if(typeof window.myfunc == "function"){
        alert("Why does myfunc already exist ?");
    }

    function myfunc(){

    }
</script>

myfunc 関数がまだ定義されていない間に警告を表示しますか?

Chrome、Safari、および IE (FF ではない) で、この動作に関連する問題が見つかったと思います。関数を含むjsファイルがWebページに複数回含まれている場合、関数のプロトタイプを拡張できません。バグと呼んで報告する前に、これについてもっと知りたいです。

ありがとうございました !

4

2 に答える 2

2

関数本体を含む名前付き関数宣言は、JavaScript のスコープの先頭に引き上げられます。JavaScript のスコープと巻き上げに関するこの記事を読むことをお勧めします。

関数を名前付き変数に割り当てるこのようなことをした場合、変数宣言のみが巻き上げられますが、割り当てが実際に行われるまで値はありません。

if (typeof myFunc == 'function') {
    // will not be reached
}

var myFunc = function() { ... }

上記は効果的に次のように扱われます。

var myFunc; // myFunc is undefined

if (typeof myFunc == 'function') {
    // will not be reached
}

myFunc = function() { ... }
于 2012-06-22T15:20:37.777 に答える
1

一言:巻き上げ

JavaScript ガーデンからの引用:

「上記の関数は、プログラムの実行が開始される前に巻き上げられます。したがって、ソース内の実際の定義の前に呼び出されたとしても、定義されたスコープ内のどこでも使用できます。」

詳細はこちら: http://bonsaiden.github.com/JavaScript-Garden/#function.general

于 2012-06-22T15:17:12.117 に答える