鍍金池/ 問答/HTML/ 直接調(diào)用eval()的上下文環(huán)境到底在哪里?

直接調(diào)用eval()的上下文環(huán)境到底在哪里?

var foo = function(a) {
    eval(a);
};
foo("return; ");

此時報錯:return not in function;
也就是說執(zhí)行eval()的上下文環(huán)境是調(diào)用foo函數(shù)的上下文環(huán)境(即全局)

var test = function(a) {
    var x = 0;
    eval(a);
    return x;
}

console.log(test("x++;"));
控制臺輸出1;
此時執(zhí)行eval()的上下文環(huán)境是test函數(shù)里面,而不是在全局
這是為什么?

回答
編輯回答
法克魷

應該是這個列子中的 return的問題
把第一個例子稍微改下,不用return。

 var foo = function(a) {
    var ab = 0;
     eval(a);
};
foo("alert(ab)")

得到的結(jié)論就跟第二個例子一樣來了

通過eval()執(zhí)行的代碼,具有與該執(zhí)行環(huán)境相同的作用域鏈 ,不一定是全局。

我感覺,應該是 return 是函數(shù)結(jié)構(gòu)的一部分,(這里的結(jié)構(gòu)不是指函數(shù)簽名,畢竟js 沒有函數(shù)簽名,而且函數(shù)簽名也不包括函數(shù)返回值)不可能通過傳遞參數(shù),改變函數(shù)結(jié)構(gòu)。

2018年5月7日 02:24