如果我在 google chrome 控制台中运行以下代码,我会得到以下结果
var x = 1;
alert(delete x); // false
eval('var y = 2');
alert(delete y); // true
为什么在第一个例子中变量没有被删除,而在第二个例子中它被删除了?
如果我在 google chrome 控制台中运行以下代码,我会得到以下结果
var x = 1;
alert(delete x); // false
eval('var y = 2');
alert(delete y); // true
为什么在第一个例子中变量没有被删除,而在第二个例子中它被删除了?
delete
仅对对象的属性有效。它对变量或函数名称没有影响。
提供的示例与您的示例相似。
x = 42; // creates the property x on the global object
var y = 43; // declares a new variable, y
delete x; // returns true (x is a property of the global object and can be deleted)
delete y; // returns false (delete doesn't affect variable names)
那么,为什么alert(delete y);
有效?我无法确定确切的答案,但基本上你不能依赖 eval 的范围。
我认为eval('var y = 2');
不会被声明为变量并被视为属性,但除了我们的测试结果之外,我还没有找到证据。我将继续研究,看看我是否找到了确切的原因。
其他关于eval
怪异的文章:
编辑 0
根据@Xavier Holt 的评论,我查找了关于eval
. 来自 Mozilla Dev 文档的这个范围备忘单有以下内容:
eval 可以捕获赋值,但不能捕获 var 声明
eval'd vars 会正常提升,因此 evals 可能会捕获类似于以下内容的分配:
function f() { { let x = "inner"; eval("var x = 'outer'"); print(x); // "outer" } }
如果我没看错,那么我之前的假设是正确的。eval()
不var
通过声明变量来评估声明。它必须创建一个属性或被视为一个属性才能delete
工作。