首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

JavaScript 閉包經典面試題:w()() 與 var d=w(); d() 輸出差異解析

     編輯:程式設計疑難解答

代碼

function w() {
    var c = 8;
    function b() { console.log(c); c++; }
    return b;
}

w()(); // 8
w()(); // 8
w()(); // 8

var d = w();
d(); // 8
d(); // 9
d(); // 10

差異原因

  • w()():每次調用 w() 都創建新的作用域,c 重新初始化為 8,返回的 b 立即執行並銷毀作用域(若無其他引用)。故每次輸出 8。
  • var d = w():w() 執行一次,創建一個作用域,c=8,返回內部函數 b 賦給 d。此時作用域被 d 引用,不會銷毀。後續每次 d() 都操作同一個 c,故遞增輸出 8,9,10。

閉包本質

函數 + 其定義時的詞法環境。d 保存了對 w 內部變量 c 的引用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved