私が行った場合:
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.
または、ブール値を返すhasOwnPropertylike 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);