9

在 Chrome 中,我从这行代码中得到“Uncaught ReferenceError: targetNode is not defined” 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.targetNode. window已定义,因此脚本知道在哪里查找,但是targetNode可能未定义属性,在这种情况下您会得到undefined.

于 2013-01-29T19:47:00.870 回答