直接總結吧:
eval()直接呼叫時,它在呼叫它的上下文中執行。
間接呼叫時,使用全域性物件作為上下文作用域,並且無法讀,寫,定義區域性變數和函式。
例子:var geval = eval;//這裡呼叫geval => 間接呼叫eval;
var x = "global", y = "global";
function fn(){ //此函式直接呼叫eval()
var x = "local";
eval("x = x +'changed'");
return x ;
function gn(){ //此函式間接呼叫eval()
var y = "local";
geval("y = y + 'changed'");
return y;
console.log(fn(), x);//這裡會輸出localchanged global,這裡的localchanged 就是fn中返回的結果,而全域性屬性x依然為global;
console.log(gn(), y);//這裡會輸出local globalchanged,解釋一下原因:
如前面所述,當間接呼叫eval()時,使用全域性物件作為上下文作用域,並且無法讀,寫,定義區域性變數和函式。
所以在gn()裡面,就算var y = "local",geval()也是無法讀取的,或者寫的,它只能讀到全域性的var y = "global",最後就直接return了gn()裡面定義的var y = "local";
但是又因為geval()使用全域性物件作為上下文作用域,所以它在gn()裡面,取得了全域性的y = "global",
並使用 y = y + 'changed'改變了全域性屬性y的值為'globalchanged',所以console.log(gn(), y)輸出了local globalchanged,前乙個local為gn()直接return的,第二個globalchanged為全域性y被geval()改變過的。
btw,我在提這個**的時候一直提示
js 權威指南學習筆記2
第三章 型別 值和變數 1 js的資料型別分為兩類 原始型別 基本資料型別 不可變型別 和物件型別 引用資料型別 可變型別 js中的原始型別包括數字 字串 布林值,還有兩個特殊的 null和undefined。物件是屬性的集合。陣列 函式是特殊的物件。如果函式用來初始化 使用new運算子 乙個新建的...
《Hadoop權威指南》閱讀記錄2
第3章 hadoop分布式檔案系統 hadoop distributed filesystem 以流式資料訪問模式來儲存超大檔案 hadoop的構建思路 一次寫入,多次讀取時最高效的訪問模式,讀取整個資料集的時間延遲,比讀取第一條記錄的時間延遲更重要。目前,寫操作總是將資料新增在檔案的末尾,他不支援...
《CSS權威指南》學習記錄 浮動
關鍵字 float。可接受 left right none 預設值 適用於所有元素。無繼承性。乙個元素浮動時,其他元素會 圍繞 該元素。浮動元素不會與周圍元素發生外邊距合併。如果要浮動乙個非替換元素,則必須要為其宣告乙個width。讓乙個元素浮動,它會像塊級元素一樣擺放和表現,但本質不變。幾點規則 ...