我尝试实现一个类似于angular.isDefined(...)
的函数,但允许检查变量及其属性,因此我编写了这个概念验证:
function check(s) {
let parts = s.split('\.');
let partial = '';
return parts.every(p => {
partial += (partial ? '.': '') + p;
let expr = `typeof ${partial}`;
console.log('Evaluating', expr);
return eval(expr) !== 'undefined';
});
}
check('obj');
let obj={};
check('obj');
obj.a=1;
check('obj.a');
我知道typeof
可以用于未声明的标识符,并且它似乎在eval()
内正常工作:
console.log(typeof someVariableWhichDoesNotExists)
console.log(eval('typeof someVariableWhichDoesNotExists'));
但是当我的代码被 eval()
处理时失败了。我漏掉了什么?
PS:我读过为什么 typeof 有时会抛出 ReferenceError?,但我认为这不是同样的情况,因为我这里并没有检查表达式,而只是一个标识符。
eval('typeof obj'); let obj;
。这会抛出一个ReferenceError,但是如果你移除let obj
,错误就会消失,而且eval
返回了预期的'undefined'
。将let obj
移到eval
之前也可以让错误消失,这让我想到这可能与变量提升有关。 - Jordan Runninglet
改成var
,代码就能按预期工作。非常有趣。 - Mathyn