9

Chrome では、このコード行から「Uncaught ReferenceError: targetNode が定義されていません」というメッセージが表示されますconsole.log(_.isUndefined(targetNode));

console.log(targetNode === void(0));と を実行すると同じエラーが発生しますconsole.log(targetNode);

typeof targetNode === "undefined"期待どおり true を返しますが、私の理解では、void(0) 比較の方が効率的です。

のデフォルトを設定するtargetNodeか、単に使用することでこれを回避できtypeof targetNode === "undefined"ますが、変数が未定義の場合、変数が未定義であるかどうかのテストが詰まる理由を理解しようとしています。

4

1 に答える 1

10

を要求するとtargetNode、ローカル変数が検索され、チェーンの最後に到達するまで後続の親スコープが検索されます。それでも見つからない場合は、エラーです。

typeof変数を取得してキャッチtry..catchで返すのと同じように機能するという点で特別です。変数を関数に渡すには変数を解決する必要があるため、"undefined"非ネイティブ コード ( など) ではこれを行うことができません。isUndefined

ただし、シンボルが定義されている場合は、有効に渡すことができます。例えば:

function test(param) {
    console.log(_.isUndefined(param));
}
test("argument");
test(); // undefined argument

または別の例:

function test() {
    console.log(_.isUndefined(foo)); // true, no error due to hoisting
    var foo = 3;
    console.log(_.isUndefined(foo)); // false, foo is defined now.
}

などの明示的なソースを指定することもできますwindow.targetNodewindowが定義されているため、スクリプトはどこを見ればよいかを認識しますが、targetNodeプロパティが定義されていない可能性があり、その場合はundefined.

于 2013-01-29T19:47:00.870 に答える