トップレベルで for...は使わないのが望ましいのか？


あらためて美しいJavaScriptを書きたいなと思い、JSLintを使い始めました  
下記をJSLintにかけたとき

[code]

    var myArr = [1,2,3];
    for (var i = 0; i < myArr.length; i += 1) {
        //
    }
    
[/code]

> # 1 Unexpected 'for' at top level.
>
> for (var i = 0; i < myArr.length; i += 1) { // Line 2, Pos 1
>
> # 2 Unexpected 'var'.
>
> for (var i = 0; i < myArr.length; i += 1) { // Line 2, Pos 6

と評価されます。まぁJSLintが絶対とはおもいませんが・・・

  * トップレベルでFORは使わないほうがよいのでしょうか？
  * i の宣言は前もって宣言しておいたほうが良いのでしょうか？

あるいは、JSLintのポリシーについて解説などあるリソースなどございましたら、ご教授くださいませ。よろしくお願いします。




@argus さんの回答を見るかぎり、for文そのものの使用についてはなんとも…なのですが、

  * _i の宣言は前もって宣言しておいたほうが良いのでしょうか？_

これ(forの中でvarを使うこと)については、かなりはっきりと説明できる危険性があります。

それはJavaScriptのローカル変数のスコープは関数/クロージャ単位であって、(他の似た文法の言語のような)ブロック単位ではない、という点です。

[code]

        var i = 0;
        for( var i = 0; i < 10; ++i ) {
            //
        }
        alert(i); //->10
    
[/code]

他の言語に慣れた方だと、forの中でvar付きで宣言された`i`はその外側の`i`とは別物で、外側の`i`はfor文の実行前後で値が変化しないように思われる方が多いのですが、実際にはforの外側の`i`とfor内にvar付きで使われている`i`は同じ変数をさしており、alert等で確認すればすぐにわかりますが、for文の実行結果後の値が表示されます。

そのような、スコープを間違えそうなvarの使い方すべてにJSLintが警告を出してくれるかどうかは知らないのですが、for-
varはつい勘違いする人が多そうなので、一律警告を出してくるのには意味があると思います。(まぁ、私はスコープのことをわかっててもよくこの書き方をするので、JSLintは使わないと思いますが…。)




@argus さんの回答を見るかぎり、for文そのものの使用についてはなんとも…なのですが、

  * _i の宣言は前もって宣言しておいたほうが良いのでしょうか？_

これ(forの中でvarを使うこと)については、かなりはっきりと説明できる危険性があります。

それはJavaScriptのローカル変数のスコープは関数/クロージャ単位であって、(他の似た文法の言語のような)ブロック単位ではない、という点です。

[code]

        var i = 0;
        for( var i = 0; i < 10; ++i ) {
            //
        }
        alert(i); //->10
    
[/code]

他の言語に慣れた方だと、forの中でvar付きで宣言された`i`はその外側の`i`とは別物で、外側の`i`はfor文の実行前後で値が変化しないように思われる方が多いのですが、実際にはforの外側の`i`とfor内にvar付きで使われている`i`は同じ変数をさしており、alert等で確認すればすぐにわかりますが、for文の実行結果後の値が表示されます。

そのような、スコープを間違えそうなvarの使い方すべてにJSLintが警告を出してくれるかどうかは知らないのですが、for-
varはつい勘違いする人が多そうなので、一律警告を出してくるのには意味があると思います。(まぁ、私はスコープのことをわかっててもよくこの書き方をするので、JSLintは使わないと思いますが…。)

