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文档在本例中非常有用。