2016-09-29 4 views
3

外側のスコープから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();

+0

Z見つけに行くlocalscopeに見て、Z = 3 原因this.zを取得します

undifineなります。 – OrangeDog

+0

http://www.es6fiddle。net/itodgq1r/ – Shane

+1

「Uncaught ReferenceError:z is not defined」というメッセージが表示されます。 jarsのようにvarsを初期化できますか? – juju

答えて

4

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; 

と同様です。動作させるには、変数の名前を変更する必要があります。

1

w + 1wが仮パラメータでwを探しますが、それを見つけられず、外側のスコープが使用されるため、最初のものが機能します。次に、x +1xは、仮パラメータのスコープ内の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(); 
0

あなたは 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

関連する問題