8

ええ、ええ、私は知っています、厳密なモードはまだ出回っていませんが、実際には、私は将来を計画しています...

それで、これはなぜですか:

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();

... ES5 Strictモードでは許可されていませんか?

それとも私は誤解していますか?JSLint:

516行目の文字18の問題:厳密な違反。

もう少し冗長になりますか?

編集:

混乱を避けるために、元のコードの詳細を次に示します。

function displayLegend() {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
}
4

2 に答える 2

6

JSLintでのこのコードの試行錯誤

"use strict";
var that="dd";
function $(x){return x;}

$('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
$(this);

何が問題なのかを示していthisます。パラメータとして使用しています。両方のthisesをthatsに変更しても、エラーは発生しません。

仕様が言うように:

これが厳密なモードコード内で評価される場合、このはオブジェクトに強制変換されません。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のダグラスクロックフォード]

彼がここで有効なポイントを持っていることを認めなければなりません。グローバルな名前空間の汚染を回避することが目標である場合は、関数宣言を使用するのではなく、とにかくプライベート名前空間内の関数式を使用する必要があります。しかし、私は言及されたスレッドの他の人たちに同意します。エラーメッセージはもっと明確にすべきです(そしておそらく関数宣言に遭遇すると警告を投げます)。

于 2010-12-01T11:12:52.437 に答える
3

David Dorwardが言ったことに続いて、私はJSLintのテストに合格するものを見つけました。これは、なぜそれをしているのかについてはまったく奇妙です。

前:(質問を参照)

後:

var displayLegend = function () {
    $('#'+ $(this).attr('id').replace('control-', 'legend-')).fadeIn();
};

編集:

ダグラス・クロックフォードに聞いた:

JSLintは、明らかにメソッドとして呼び出されることを意図した関数で、厳密モードでのみこれを許可します。だから書く

object.property = function () {
    ... this ...
};

これは、それがはるかに明確であることを除いて、仕様でそれが言っていることを確認します!

于 2010-12-01T11:29:30.950 に答える