2016-06-15 1 views
0

jQueryとJavascriptの学習中に奇妙な動作が観察されました。私は.ready $(ドキュメント)内で定義された変数を呼び出すと、これらのタグの外側から、それは、私がグローバル変数として定義しても、例えば を未定義表示されます。変数がドキュメント準備完了タグの外で未定義に表示される理由

$(document).ready(function() { 
    myVar = "test"; 
}); 
alert(typeof(myVar)); 
//Results "undefined" 

私が呼び出した場合同じ変数がdocument.readyタグ内で期待通りに動作します

$(document).ready(function() { 
    myVar = "test"; 
    alert(typeof(myVar)); 
    //Results "String" 
}); 

結果は、ウィンドウプレフィックスを使用した後でも同じです。

$(document).ready(function() { 
    window.myVar = "test"; 
}); 
alert(typeof(window.myVar)); 
//Results "undefined" 

私は変数スコープについて理解していますが、なぜグローバル変数でさえこのように動作しないのですか?私はとても混乱しています。

+0

チェック[this](http://stackoverflow.com/a/4363155/4790490)投稿 – Hearty

答えて

3

「準備完了」ハンドラ内のコードは、DOMが完全に構築されるまで実行されません。コードの外にあるは、ハンドラが遭遇するとすぐに実行されます。したがって、alert()の前に実行されます。ハンドラのコードが実行されるため、結果は完全に意味します。グローバル変数はまだ初期化されていないため、その値はundefinedです。

あなたはalert()(または、より良い、console.log())を置くことによって明確に実行順序を見ることができる「準備完了」ハンドラ内で呼び出します。

$(document).ready(function() { 
    console.log("In the 'ready' handler"); 
}); 
console.log("Outside the 'ready' handler"); 

それが実行されると、あなたは「外」のメッセージが表示されます最初にを記録しました。

+0

完璧な説明! –

1

文書が完全に準備ができる前にalert()が実行されているので..あなたはまだそれが未定義戻ります$(document).ready()前に変数を宣言することでも、試すこと..

0

$(ドキュメント).ready()は、後に解雇ますページが完全にロードされた

スクリプトタグが完全に読み込まれると、警告が実行されます。

ので

  1. スクリプトタグは=>警告実行completlyロード
  2. ロードページを続行
  3. ページ=>火災$(文書)は
  4. あなたのvarは
  5. を設定取得されて.readyロードされ、

varが設定される前に警告が実行されます

0

他の回答は正しいですが、$(document).ready(...)が変数をグローバルスコープから隠していることにも注意することが重要です。あなたはが後に実行されるイベントを割り当てることのようです)、それは

//this statement shall fix the driver, not run it 
$(document).ready(function() {//-->this it's an event handler waiting to be fired when content is fully loaded 
    myVar = "test";//-->myVar won't exists until this event is triggered 
}); 
//this execute the alert function but myVar not exist yet 
alert(typeof(myVar)); 

$(ドキュメント).ready(のようなものだ実行計画関数内

var myVar; 

$(document).ready(function() { 
    myVar = "test"; 
}); 

console.log(myVar) // test 
+1

いいえ、変数が 'var'宣言のない関数で参照されているためです。それは暗黙的にグローバルです。 – Pointy

+0

はい、あなたは正しいです、私はスコープで読んでいて、それを完全に考えずに質問に飛び乗ってきました。私は、JSFiddleラッパー文書がコードを実行する前に準備が整っているので、私はこれをフィドルで再作成できない理由を想定しています。 –

+0

jsfiddleのデフォルト設定は、コードをウィンドウの "load"ハンドラで実行することです.JavaScriptのオプションで制御できます。 JavaScriptパネルの右上隅にある小さな「歯車」アイコンをクリックします。 – Pointy

0

それを更新し、あなたの変数を宣言することができ内容がロードされます。つまり、alert(myVar)は、コンテンツがロードされたイベントとして設定されたラムダ実行の前に実行されます。あなたが私を理解することを願っています。

関連する問題