我正在阅读High Performance JavaScript。在本书中,作者给出了以下代码:
function execute(code) {
eval(code);
function subroutine(){
return window;
}
var w = subroutine();
//what value is w?
};
他用以下语句运行该函数:
execute("var window = {};")
他说:
在这种情况下,eval()在execute()中创建一个本地窗口变量,所以w 最终等于本地窗口而不是全局窗口。没有 在执行代码之前知道是否是这种情况的方法 表示无法预先确定窗口标识符的值。
我不知道裸括号(code);
在这里是什么意思。我尝试了他的代码,我得到了w作为全局Window实例。不是"创建的本地窗口"(空对象)。我想知道发生了什么......
答案 0 :(得分:2)
发生的事情是代码示例中的eval()
执行该字符串中的代码。该代码创建一个名为window
的局部变量,并为其分配一个空对象。
关键是,使用该特定字符串,子例程()中的window
引用该变量,但如果它是一个完全不同的字符串而没有提及window
,那么{{子例程中的1}}可能最终引用了全局window
对象。
关键在于,对于编写代码的人以及尝试优化代码的JS引擎而言,这对于具有可预测的代码而言完全是疯狂的。因此,您应该避免这样做。
答案 1 :(得分:0)
{}
是一个对象文字,创建一个空白对象。
然而,他的代码是完全错误的。您不能像这样执行任意代码 - 您需要使用eval()
。因此,没有本地window
对象。他只是忽略了一个字符串,然后返回了真正的窗口。