gpt4 book ai didi

javascript - 为什么 eval() 中的 typeof 在我的函数中抛出错误?

转载 作者:可可西里 更新时间:2023-11-01 02:40:02 27 4
gpt4 key购买 nike

我试图实现类似于 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()无关。您的错误是由于定义 let obj 但在定义之前尝试使用它引起的。此异常描述为 here :

But with the addition of block-scoped let and const, using typeof on let and const variables (or using typeof on a class) in a block before they are declared will throw a ReferenceError. Block scoped variables are in a "temporal dead zone" from the start of the block until the initialization is processed, during which, it will throw an error if accessed

如果没有 eval(),您很容易导致此错误:

// undefined no problem because obj was not declared
console.log(typeof obj)

// undefined but variable declared with let
// but not defined before using it results in an error
console.log(typeof otherobj)
let otherobj = {}

如果您删除 let obj={}; 声明或使用 var obj = {},您的错误就会消失。

关于javascript - 为什么 eval() 中的 typeof 在我的函数中抛出错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55497317/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com