亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

箭頭函數(這是一個參數)如何接受 x 的值作為 1 并返回它?

箭頭函數(這是一個參數)如何接受 x 的值作為 1 并返回它?

慕哥9229398 2021-08-26 15:06:38
console.log((function(x, f = () => x) {  var x;  var y = x;  x = 2;  return [x, y, f()];})(1));這是代碼片段。這里的輸出是 (3) [2, 1, 1] 第三個輸出如何是 1 而不是 2?此外,如果我在 Scratch JS 上運行此代碼,它會打印 (3) [2, 1, 2]為什么這里的輸出不同?我嘗試在 IIFE 函數中傳遞第二個參數,如下所示:console.log((function(x, f = (z) => z) {  var x;  var y = x;  x = 2;  return [x, y, f(z)];})(1, 2));但這會引發錯誤chrome 控制臺中的輸出是 (3) [2, 1, 1],而 Scratch JS 中的輸出是 (3) [2, 1, 2]
查看完整描述

2 回答

?
慕婉清6462132

TA貢獻1804條經驗 獲得超2個贊

在第一種情況下,() => x返回 1,因為您沒有將函數作為第二個參數傳遞,這意味著箭頭函數在您的函數之外實例化并保持其自己的上下文。的x在函數內部被限制在不同的上下文中。

這是帶有陰影名稱變量、名稱相同但嵌套上下文不同的經典問題。

在第二個示例中,您將值2作為參數中的函數傳遞,這就是它拋出的原因。你不能執行2()。


查看完整回答
反對 回復 2021-08-26
?
慕虎7371278

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。


查看完整回答
反對 回復 2021-08-26
  • 2 回答
  • 0 關注
  • 246 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號