2017-08-24 5 views
0

これはなぜ機能しないのか誰かが説明できますか?typeOf undefinedが動作していないことを確認しますか?

setOrientation: function() { 
    if (typeof oldOrientation !== 'undefined') console.log(oldOrientation); 
    let oldOrientation = orientation; 
    //other code 
} 

これはoldOrientation is undefinedをスローします。私は最終的にはletを単に削除して作業を開始しましたが、理由を完全に理解するのは苦労しています。私はそれがスコープと関係があると思いますか?

oldOrientationをグローバルに宣言することで問題を解決しましたが、typeofの比較がなぜそれほど機能していないのか理解したいだけです。その後警告(a)のは、変数の参照を行います

let a = 1; 

{ 
alert(a); 
let a = 2; 
} 

+0

これを関数の内部で定義すると、それをグローバルにするためです。 – epascarello

+0

しかし、関係なく、比較によって '' undefined ''が返されるべきではないので、エラーは発生しませんか? –

+3

吊り下げ....... – epascarello

答えて

3

From MDN let:

In ECMAScript 2015, let bindings are not subject to Variable Hoisting, which means that let declarations do not move to the top of the current execution context. Referencing the variable in the block before the initialization results in a ReferenceError (contrary to a variable declared with var, which will just have the undefined value). The variable is in a "temporal dead zone" from the start of the block until the initialization is processed.

はそれが前に変数を使用する手段定義された。


あなたがvarを使用して使用した場合、何が起こるかはvar宣言があるため、巻上のブロックスコープの一番上に移動されます。したがって、次の機能

function foo() { 
    console.log(typeof bar) 
    var bar = "123"; 
} 

function foo() { 
    var bar; 
    console.log(typeof bar) 
    bar = "123"; 
} 

として見しかし、もしあなたがletを使用する場合、宣言はブロックの最上部に移動されていないので、何の巻き上げ自分ではありません。

+0

少しは助けますが、これはChromeがエラーを正しく処理していないことを意味しますか? –

+0

私はそれをchromeで実行し、 '' message ":" Uncaught ReferenceError:oldOrientationが定義されていません "というエラーメッセージを正しく返すように見えます。 – epascarello

+0

@epascarello javascript noobここ、私はC#から来て、あなたが何を言っているのか理解するのが苦労している。だから、基本的に問題は 'let'は可変ホイストを使用していないということです。したがって' let 'で変数を宣言しているならif文が意味をなさないでしょうか?しかし、 'var'を使うとうまくいくでしょうか? – jdmdevdotnet

2

は、この簡略化された場合を想像してみてください。これは、現在のスコープ(ブロック)から始まり、それ自身の変数(になります)がまだ設定されていません(a = 2)。アッパーに等しいです:

let a = 1; 

{ 
let a /* = undefined */; 
alert(a); 
a = 2; 
} 

(コードが実行される前に、変数が宣言されていることhoistingと呼ばれている...)

+2

これは良い答えです。おそらくJSの巻上げについてもっと学ぶためのリソースを指しているかもしれません。 –

+0

申し訳ありませんが、巻上げのために、比較時に変数*が宣言されましたが、ログに記録しようとしたときに定義されていませんでしたか? –

+0

@rather notsayはい。変数が宣言されると、変数は未定義に設定されます。 –

関連する問題