2012-03-20 9 views
3

私はこれを見ました:http://www.youtube.com/watch?v=mHtdZgou0qU昨日、私は自分のJavaScriptを改善する方法について考えてきました。私はfirefoxで本当に不安定に見えるアニメーションを書き直すときに、彼が気にしていたことをすべて守ろうとしています。forループはJavascriptのスコープチェーンに別のオブジェクトを追加しますか?

forループがスコープチェーンに追加されていると私が思っていることの1つです。 Zakasはクロージャがどのようにスコープチェーンに追加されるかについて多くのことを話し、ローカルスコープ外の変数へのアクセスは時間がかかる傾向があります。 forループでは、最初のステートメントで変数を宣言できます。これはチェーンに別のスコープを追加していることを意味しますか?私は、Zakasもdo-whilewhile、そしてforのループの間に違いがないと言っていたので、私は仮定しませんでした。

私は、多くの場合、JSライブラリで、見るので、私が尋ねる理由の一部である、のようなコード:

function foo(){ 
    var x=window.bar, 
     i=0, 
     len=x.length; 
    for(;i<len;i++){ 
     // 
    } 
} 

forループはチェーンに別のオブジェクトを追加しました場合は、これは非常に非効率的なコードになります、なぜならループ内のすべての操作(iを使用していると仮定)は、範囲外の変数にアクセスしています。

また、私はそれに賭けるように頼まれた場合、私はそうではないと言いますが、使用される変数はループ外でアクセスできないのでしょうか?

+0

'for'ループ内で宣言された変数は、とにかく吊り上げられるので、明示的に宣言する理由はありません。 –

答えて

5

JavaScriptはブロックスコープを持たず、可変ホイストを持っているため、forループで定義されているように見える変数は実際には定義されていません。

あなたの例で提供されているようなコードが表示されるのは、巻き上げ動作のためです。コードの作成者は可変ホイストを知っているので、最初はスコープのすべての変数を宣言しているので、JavaScriptが何をしているのかは明らかです。

+0

申し訳ありませんが、私は見た後に仮定したものです:http://stackoverflow.com/questions/1236206/one-var-per-function-in-javascript、しかし、なぜ変数はループの外にアクセスできないのですか? – mowwwalker

+0

個人的には、ループの初期化子を 'var'に入れるのは混乱していると思います...私はいつも' var i; 'を行いますが' for(...) 'に' i = 0'を入れます... –

+1

@Walkerneoループ内で定義されているように見える変数*は、ループの外側からアクセス可能です。 – alex

関連する問題