为什么下划线的_.isUndefined(变量)会给出一个错误,即未定义变量?

时间:2013-01-29 19:41:32

标签: javascript undefined underscore.js

在Chrome中,我从这行代码console.log(_.isUndefined(targetNode));获得“未捕获的ReferenceError:targetNode未定义”。

当我console.log(targetNode === void(0));console.log(targetNode);时,我收到同样的错误。

typeof targetNode === "undefined"按预期返回true,但我的理解是void(0)比较效率更高。

我可以通过设置targetNode的默认值来解决这个问题,或者我可以使用typeof targetNode === "undefined",但我试图理解为什么变量是否未定义的测试会阻塞变量未定义。

1 个答案:

答案 0 :(得分:10)

当你要求targetNode时,它会查找一个局部变量,然后在后续的父作用域中查找,直到它到达链的末尾。如果它仍然没有找到它,则会出现错误。

typeof的特殊之处在于它在获取变量时类似于try..catch,并且在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