私が行った場合:
var i = j = 0;
j
ローカル変数ですか?- 証明する。
巻き上げた後、コードは次のようになります。
var i;
j = 0;
i = j;
したがってi
、ローカル変数ですが、そうでj
はありません。
楽しみのために、ここに別の「証拠」があります:
(function() {"use strict"; var i = j = 0;}());
// throws "ReferenceError: assignment to undeclared variable j"
j
グローバル変数になるか、out スコープの変数に割り当てられます。
(function() { var i = j = 0; })()
// i is undefined
// j is 0
var i = 42;
var j = 1;
(function() { var i = j = 0; })()
// i remains 42
// j is 0
の宣言はj
と同じ宣言式ではないためi
、変数は外側のスコープで作成されるか、そこに存在する場合は外側のスコープの値を上書きします。
がグローバルになった理由i
は、変数ホイストによるものです。これを次のように分解できます。
1)var i
2) j
、これは現在のスコープで宣言j
されています。これは、 を使用していないため、式が現在のコンテキストにバインドされていないため、包含スコープvar
です。
3)= 0
が に割り当てj
られ0
、続いて に割り当てj
られi
ます。
証拠?
window
それが値であることを警告する場合はオブジェクト上にあるかどうかを確認し、それalert(window.j)
がローカルでない場合はグローバルです(var
キーワードを使用するときに関数内にない場合はグローバルであり、var
そうでない場合は定義したかどうかに関係なくグローバルです。したがって、 j と i は両方ですグローバル)。例:
var i = j = 0;
function x(){
var r = 100;
alert(r);
}
alert(window.i); //will alert 0.
alert(window.j); //will alert 0.
x(); // will alert 100.
alert(window.r); //will alert undefined.
または、ブール値を返すhasOwnProperty
like soを使用できます。alert(window.hasOwnProperty("i"))
ちなみに、jsfiddle を使用してこれをテストしようとするとi
返されるためundefined
(jsfiddle が独自のグローバル名前空間を保護する方法に関係している可能性があります)、これをテストするには空白の html ページが必要です。
(function(){
var i = j = 0;
})();
try{
alert(i);
}catch(e){
alert(e);
}
alert(j);
特に証拠はありません...実際に例外的なケースでない限り、通常のプログラムフローで例外を使用しません。しかし、それは動作を示しています。
function test(a){
var i=j=0;
return i;
};
test(100);
alert(j);
alert(i);