5
Unexpected 'typeof'. Use '===' to compare directly with undefined.

    if (typeof exports !== 'undefined') {

これはbackbone.jsのコードです。

構文が気に入らないようです。

jslint.comを幸せにするためにこのコードを変更するにはどうすればよいですか?

4

5 に答える 5

4

Underscore ライブラリ (Backbone と CoffeeScript を作成したのと同じ人物によって作成されたので、よく考え抜かれたものであることがわかります) は、次のisUndefined機能を使用します。

obj === void 0

完全に安全な (誰かが を再定義するという変則的なケースであってもundefined) アプローチが必要な場合でも、気難しい年寄りの Crockford (JSLint を書いている人) を満足させるには、そのチェックを使用します。見栄えが悪いので、せめて説明コメントを付けておきます。

さらに良いことにisUndefined、Underscore のような独自の関数にロールアップすることもできます。または、最初から Underscore の関数を使用することもできます。Backbone を使用している場合は、Backbone が必要とするため、既に Underscore があります。

于 2013-01-30T00:47:21.217 に答える
3

jsLint は、トリックundefinedを使用する代わりに との直接比較を期待しているように見えます。typeof foo === "undefined"

を使用しtypeof exports === "undefined"ても同じエラーが発生しますが、exports === undefinedパス jsLint を使用すると次のようになります。

var exports;
var test;

if (exports === undefined) {
    test = "foobar";
}

これは をチェックするためのよりクリーンな方法であり、おそらくやundefinedのような間違いが起こりにくいでしょう。exports === "undefined"typeof exports === undefined

于 2013-01-30T00:32:51.480 に答える
2

undefined が再定義されていないことを確認するには:

var is_undefined=(function(undefined){
  return function(a){return a===undefined;};
}(/*omitted argument is undefined*/));

省略された引数は未定義であるという事実を利用しています。

アップデート

もっと簡単な方法は

function is_undefined(x){return x===[][0];}
于 2013-01-30T06:36:13.637 に答える
1

関数や代替手段を使用せずに JSLint を満足させるにはどうすればよいかという最初の質問に答えるためにtypeof

を使用した結果を宣言することで、JSLint エラー メッセージを回避できますtypeof

var hasExports = typeof exports;
if (hasExports !== 'undefined') {
   //...
}
于 2014-11-25T21:09:06.610 に答える
0

jsLint を気にしない関数を作成できます。

function getTypeof(obj) {
  'use strict';
  return typeof obj;
}

次に、typeof を直接使用する代わりに、getTypeof 関数を呼び出すことができます。

var exports,
    test;

if (getTypeof(exports) === "undefined") {
    test = "foobar";
}

余分な作業がたくさんあるように思えますが、Crockford が if ステートメントで typeof を使用することに反対している理由はまだわかりません。

于 2014-12-24T00:32:12.847 に答える