21777


あらためて美しい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のポリシーについて解説などあるリソースなどございましたら、ご教授くださいませ。よろしくお願いします。


CC BY-SA 3.0
2016-02-06T09:28:32.947
21772
2016-02-06T11:10:15.447
8013
question
javascript
トップレベルで for...は使わないのが望ましいのか？


JSLint の [source code](https://github.com/douglascrockford/JSLint)
を眺めてみたのですが、非常に厳しいですね。デフォルトでは `for statement` を使っただけで警告が表示されてしまいます。まずは
`Tolerate` の `for statement` にチェックを入れて、以下の様に書く必要があります。

[code]

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

ただ、こうしても `Empty block.` と言われます。

`for statement` については [JSLint: Help](http://jslint.com/help.html) に以下の記述があります。

> **Tolerate for statement**  
>  true if the for statement should be allowed. It is almost always better to
> use the array methods instead.

ソースコードと上記のヘルプを眺める限り、JSLint の作者である Douglas Crockford さんの **単なる好み**
なんじゃないかと思いますけど。


CC BY-SA 3.0
2016-02-06T10:45:20.030
21776
2016-02-06T10:45:20.030
21772
answer


@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は使わないと思いますが…。)


CC BY-SA 3.0
2016-02-06T11:10:15.447
21777
2016-02-06T11:10:15.447
13972
21772
answer