【发布时间】:2019-04-03 14:15:42
【问题描述】:
我试图实现类似于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:我看过Why does typeof only sometimes throw ReferenceError? 但我认为这不是同一个场景,我这里不是检查表达式,而只是一个标识符。
【问题讨论】:
-
这真的很有趣。这是一个较小的复制品:
eval('typeof obj'); let obj;。这会引发 ReferenceError,但如果您删除let obj,错误就会消失,eval按预期返回'undefined'。在eval之前移动let obj也会使错误消失,这让我认为这与提升有关。 -
@JordanRunning 如果您将
let更改为var,代码将按预期工作。很有趣。
标签: javascript eval