JSLintでのこのコードの試行錯誤
"use strict";
var that="dd";
function $(x){return x;}
$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);
何が問題なのかを示していthis
ます。パラメータとして使用しています。両方のthis
esをthat
sに変更しても、エラーは発生しません。
仕様が言うように:
これが厳密なモードコード内で評価される場合、この値はオブジェクトに強制変換されません。nullまたは未定義のこの値はグローバルオブジェクトに変換されず、プリミティブ値はラッパーオブジェクトに変換されません。関数呼び出し(Function.prototype.applyおよびFunction.prototype.callを使用して行われた呼び出しを含む)を介して渡されたこの値は、渡されたこの値をオブジェクト(10.4.3、11.1.1、15.3.4.3、15.3 )に強制しません。 4.4)。[私の強調]
ジョン・レシグが書いているように、
最後に、長年の(そして非常に厄介な)バグが解決されました。nullまたはundefinedが強制的にグローバルオブジェクトになる場合。厳密モードでは、これが発生するのを防ぎ、代わりに例外をスローするようになりました。
(function(){ ... }).call( null ); // Exception
示したように、関数宣言内でコード行を使用するとJSLintでエラーがスローされますが、関数式内で使用するとエラーは発生しません。JSLintが関数宣言を誤って解析し、this
それが現時点ではまだ定義されていないことを確認し、例外をスローしているようです。
この時点で、私はJuriy Zaytsev('kangax')を引用する必要があると思います:
それは本当に重要ですか?
厳密モードは必須ではなく、単なるオプションであることを理解しておくとよいでしょう。それを必要とし、結果に対処する(そして楽しむ)ことをいとわない人々のために、より厳しい規則を提供するためにそこにあります。
更新:ついに説明を見つけました。このスレッド、特にメッセージ#1512以降を読むと、次のようになります。
ES5 / strictのポイントは、グローバルオブジェクトのリークを禁止することです。これは、ES3が無差別に行うことです。ES5 / strictは、一部の作業を動的に実行し、一部の作業を静的に実行します。JSLintはすべての作業を静的に実行するため、プログラムを正しく実行するためには、さらに制限を厳しくする必要があります。[#1553のダグラスクロックフォード]
彼がここで有効なポイントを持っていることを認めなければなりません。グローバルな名前空間の汚染を回避することが目標である場合は、関数宣言を使用するのではなく、とにかくプライベート名前空間内の関数式を使用する必要があります。しかし、私は言及されたスレッドの他の人たちに同意します。エラーメッセージはもっと明確にすべきです(そしておそらく関数宣言に遭遇すると警告を投げます)。