6

script タグの直後にグローバル変数を宣言した場合、ドキュメント準備完了で呼び出された関数でこの変数にアクセスしても安全ですか?

<script type="text/javascript">
var bar = "foo";

$(document).ready(function(){

callBar()

});

function callBar(){
alert(bar);
// will I crash?
}
</script> 

私がこれを行うとどうなりますか:

<script type="text/javascript">

$(document).ready(function(){

callBar()

});

function callBar(){
alert(bar);
// will I crash?
}

var bar = "foo";
</script> 
4

4 に答える 4

8

ドキュメント準備完了で呼び出された関数でこの変数にアクセスしても安全ですか

はい。変数は、そのスクリプトを実行する非常に早い段階で宣言されます (実行コンテキストの変数環境へのバインディングとして追加されます)。(解析中に割り当てステートメントに到達するまで、実際には値が割り当てられないことに注意してください。これは一般に「巻き上げ」と呼ばれますが、例には影響しません)。

スクリプトの実行は同期的であるため (スクリプト要素の解析と実行が完了するまでブラウザーはレンダリングを停止します)、その実行が完了するまで DOM Ready イベントは発生しません。


編集 (質問が更新されました)

じゃあこうしたらどうなるか…

上記のように、変数宣言は、それが表示されるスコープの先頭に巻き上げられます。2番目の例は、次のように効果的に解釈されます。

// Declarations (both function and variable) are hoisted
var bar;
function callBar() {
    alert(bar);
}

$(document).ready(function () {
    callBar();
});

bar = "foo";

したがって、これらの宣言はスコープ全体で使用できます。ready イベント ハンドラーはしばらくしてから実行され、それらの宣言にアクセスできます (同じスコープに表示されるため)。

于 2013-08-06T14:07:38.850 に答える
0

barはグローバル スコープで宣言されているため、 への呼び出しの前に初期化されると予想されますcallBar

また、JavaScript には関数巻き上げ機能があり、変数が適切なスコープ内にある場合は、変数がプログラムの後半で定義されていても参照できることを考慮してください (ただし、ここではそうではありません)。Variable Scopeの MDN ドキュメントから:

JavaScript の変数に関するもう 1 つの珍しい点は、後で宣言された変数を、例外を取得せずに参照できることです。この概念は巻き上げとして知られています。JavaScript の変数は、ある意味で、関数またはステートメントの先頭に「持ち上げられた」または持ち上げられています。ただし、まだ初期化されていない変数は未定義の値を返します。

于 2013-08-06T14:08:52.030 に答える
0

はい、「close」タグの前でも。

「$(document).ready(function(){})」構造内の関数は、すべてのページが読み込まれた後に起動します。

于 2013-08-06T14:10:14.177 に答える
0

グローバル変数の操作はsafe.

ただし、Jquery でグローバル変数を使用するときは注意が必要です。

詳細情報 Window.bar="foo"の代わりに使用Jquery でグローバル変数を使用する最良の方法var bar="foo"

私はグローバル変数を使用しており、本当に便利です..

于 2013-08-06T14:12:36.060 に答える