外側のスコープからw
を受け取ることができたら、なぜそれを受け取れないのですかz
?なぜconsole.log(z)はNaNを投げますか?
var w = 1, z = 2;
function foo(x = w + 1, y = x + 1, z = z + 1) {
console.log(x, y, z);
}
foo();
外側のスコープからw
を受け取ることができたら、なぜそれを受け取れないのですかz
?なぜconsole.log(z)はNaNを投げますか?
var w = 1, z = 2;
function foo(x = w + 1, y = x + 1, z = z + 1) {
console.log(x, y, z);
}
foo();
it's able to pick up
w
from the outer scope
はい、あなたはあなたの関数内の変数w
を持っていないので。
why is it not able to pick up
z
?
あなたのパラメータは、名前z
を持つローカル変数を宣言し、それがグローバルなものを隠しているため。しかし、ローカルのものは、デフォルトの式の中の値でまだ初期化されておらず、アクセスにはReferenceError
がスローされます。それはtemporal dead zone for let
/const
、
let z = z + 1;
と同様です。動作させるには、変数の名前を変更する必要があります。
w + 1
のw
が仮パラメータでwを探しますが、それを見つけられず、外側のスコープが使用されるため、最初のものが機能します。次に、x +1
のx
は、仮パラメータのスコープ内のxの値を見つけてそれを使用するため、yへの代入はうまく動作します。
z + 1
の最後のケースでは、z
が仮パラメータスコープでまだ初期化されていないと判断し、エラーをスローして外のスコープから見つけようとする前にエラーをスローします。
変数zを@bergiによって指摘されているものに変更すると、そのトリックを行う必要があります。
var w = 1, z = 2;
function foo(x = w + 1, y = x + 1, a = z + 1) {
console.log(x, y, a);
}
foo();
あなたは x=w+1
x
中に
function foo(x = w + 1, y = x + 1, z = z + 1)
を持っても 定義されていないので、それは任意の値 を見つけるdidntのローカル実行コンテキストに見えるので、それはouterscopeを行くとワット見つける をundfined、その後w
されます= 1 ローカルスペースでw
も1になる
は今 z = z + 1
中=
の左側にあるz
はUNDEFINE であり、それはローカル実行コンテキスト内部 Zを探しても=
の右側にundifineあり、どちらz
を見つけるその後z
方程式の左側に だったので、宇宙に行く必要はありません。 のでz
は、あなたがこの方法を書いた場合ただしz=this.z+1
あなたは文句を言わない、直接それが何かを「投げる」はありませんouterscopeと= 2
Z見つけに行くlocalscopeに見て、Z = 3 原因
this.z
を取得しますundifineなります。 – OrangeDog
http://www.es6fiddle。net/itodgq1r/ – Shane
「Uncaught ReferenceError:z is not defined」というメッセージが表示されます。 jarsのようにvarsを初期化できますか? – juju