2 回答

TA貢獻1804條經驗 獲得超2個贊
在第一種情況下,() => x
返回 1,因為您沒有將函數作為第二個參數傳遞,這意味著箭頭函數在您的函數之外實例化并保持其自己的上下文。的x
在函數內部被限制在不同的上下文中。
這是帶有陰影名稱變量、名稱相同但嵌套上下文不同的經典問題。
在第二個示例中,您將值2
作為參數中的函數傳遞,這就是它拋出的原因。你不能執行2()
。

TA貢獻1802條經驗 獲得超4個贊
第三個輸出如何是 1 而不是 2?[...] 為什么這里的輸出不同?
如果代碼按編寫的方式運行,則在進入函數之前評估默認參數。所以xinf = () => x指的是函數的第一個參數,而不是var x它內部的定義。由于 1 被傳遞給 IIFE,所以 1 是使用的值。為什么這里的輸出不同?看來scratchJS 正在轉換為舊版本的javascript。這會將代碼變成這樣的:
console.log(function (x) {
var f = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () {
return x;
};
var x;
var y = x;
x = 2;
return [x, y, f()];
}(1));
現在默認值由函數體內的代碼處理。由于hoisting,var x是在執行時引用的變量return x,而不是參數列表中的 x。到調用 f 時,該局部變量已設置為 2,因此記錄了 2。
添加回答
舉報