JS權威指南學習記錄(2)eval函式

2021-08-18 02:23:26 字數 1094 閱讀 1652

直接總結吧:

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。讓乙個元素浮動,它會像塊級元素一樣擺放和表現,但本質不變。幾點規則 ...