在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"
,但我试图理解为什么变量是否未定义的测试会阻塞变量未定义。
答案 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.targetNode
。 window
已定义,因此脚本知道要查找的位置,但可能未定义targetNode
属性,在这种情况下,您将获得undefined
。