淺談eval函式

Wament發表於2019-04-12

語法

eval(string)
string表示JavaScript表示式,語句或一系列語句的字串。表示式可以包含變數以及已存在物件的屬性

返回值

  • 引數是整數或者函式,直接返回該整數或函式
  • 引數是字串,且字串是表示式,則執行該字串並返回表示式的執行結果
  • 引數是字串,且字串是JSON格式(此時的JOSN格式外面要加上一對小括號將JSON包圍起來)
  • 引數是字串,且字串是語句或語句塊,則執行該語句塊並返回undefined

作用域

  1. 直接呼叫
    eval直接在函式內部使用,此時eval的作用域是區域性作用域
function foo(){
    eval("var a=1;");
}
foo();
console.log(a);//報錯a未宣告
複製程式碼
  1. 間接呼叫 將eval賦值給另外一個變數,然後執行,此時eval的作用域是全域性作用域
function foo(){
    var fakeEval=eval;
    fakeEval("var a=1;");
}
foo();
console.log(a);//1
複製程式碼
  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
複製程式碼

相關文章