語法
eval(string)
string表示JavaScript表示式,語句或一系列語句的字串。表示式可以包含變數以及已存在物件的屬性
返回值
- 引數是整數或者函式,直接返回該整數或函式
- 引數是字串,且字串是表示式,則執行該字串並返回表示式的執行結果
- 引數是字串,且字串是JSON格式(此時的JOSN格式外面要加上一對小括號將JSON包圍起來)
- 引數是字串,且字串是語句或語句塊,則執行該語句塊並返回undefined
作用域
- 直接呼叫
eval直接在函式內部使用,此時eval的作用域是區域性作用域
function foo(){
eval("var a=1;");
}
foo();
console.log(a);//報錯a未宣告
複製程式碼
- 間接呼叫 將eval賦值給另外一個變數,然後執行,此時eval的作用域是全域性作用域
function foo(){
var fakeEval=eval;
fakeEval("var a=1;");
}
foo();
console.log(a);//1
複製程式碼
- 作為window物件的屬性呼叫 強調window.eval來執行string,此時eval的作用域是全域性作用域
function foo(){
window.eval("var a=1;");
}
foo();
console.log(a);//1
複製程式碼
嚴格模式
嚴格模式下eval會建立eval作用域,即為eval中的程式碼塊新建一個作用域,而不是像在正常模式下使用全域性作用域或區域性作用域
function foo(){
"use strict";
eval("var a=1;");
console.log(a);//嚴格模式下報錯,正常模式下輸出1
}
foo();
複製程式碼
自己做了個測試,發現嚴格模式會建立eval作用域是針對直接呼叫來說的;
當使用間接呼叫的時候,eval還是使用全域性的作用域
function foo(){
"use strict";
window.eval("var a=1;");
}
foo();
console.log(a);//不報錯,而是輸出1
複製程式碼