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

Javascript 为什么eval()中的typeof会在我的函数中抛出错误?,javascript,eval,Javascript,Eval,我试图实现一个类似于 但是允许检查变量及其属性,所以我写了这个概念证明: 功能检查{ 让零件=s.拆分('\.'); 让部分=“”; 返回部分。每个(p=>{ 部分+=(部分?'.:'')+p; 设expr=`typeof${partial}`; console.log('evaluation',expr); 返回值(expr)!=‘未定义’; }); } 检查(‘obj’); 设obj={}; 检查(‘obj’); 目标a=1; 支票(“obj.a”)这实际上与eval()无关。您的错误是由

我试图实现一个类似于

但是允许检查变量及其属性,所以我写了这个概念证明:

功能检查{
让零件=s.拆分('\.');
让部分=“”;
返回部分。每个(p=>{
部分+=(部分?'.:'')+p;
设expr=`typeof${partial}`;
console.log('evaluation',expr);
返回值(expr)!=‘未定义’;
});
}
检查(‘obj’);
设obj={};
检查(‘obj’);
目标a=1;

支票(“obj.a”)这实际上与
eval()
无关。您的错误是由定义
let obj
但在定义之前尝试使用它引起的。此例外情况描述如下:

但是,随着块作用域let和const的添加,在声明let和const变量之前在块中使用typeof(或在类中使用typeof)将抛出ReferenceError。从块的开始到初始化处理,块作用域变量处于“暂时死区”,在此期间,如果访问,它将抛出错误

如果不使用
eval()
,很容易导致此错误:

//未定义没有问题,因为未声明obj
控制台日志(obj类型)
//未定义但用let声明的变量
//但在使用前未定义会导致错误
console.log(otherobj的类型)

让otherobj={}
这真的很有趣。这里有一个较小的复制:
eval('typeof obj');让obj。这会抛出一个ReferenceError,但是如果删除
let obj
,错误就会消失,
eval
会按预期返回
'undefined'
。在
eval
之前移动
let obj
也会使错误消失,这使我认为这与提升有关。@jordan如果将
let
更改为
var
运行,代码将按预期工作。非常有趣。有关
let
的更多信息,有关的Mozilla web文档在本例中非常有用。