• <small id="ck0wk"><meter id="ck0wk"><menuitem id="ck0wk"></menuitem></meter></small>

  • <big id="ck0wk"></big>

  • 鍍金池/ 問答/網絡安全  HTML/ js閉包問題,為什么是這個結果

    js閉包問題,為什么是這個結果

    Image

    新手,對閉包的理解不夠,希望大佬們詳細說下這段代碼的運行過程,原理,機制等

    回答
    編輯回答
    陌如玉

    1、function 并沒形成閉包!你都能直接調用該函數,沒閉包說法!
    2、es6之前,只存在兩個作用域: 全局和function

    所以i和function的執行環境同,且無閉包。待調用函數時,i = 10

    2017年5月25日 23:20
    編輯回答
    囍槑

    阮一峰ES6中有將到這點

    他書中的解釋
    變量i是var命令聲明的,在全局范圍內都有效,所以全局只有一個變量i。每一次循環,變量i的值都會發生改變,而循環內被賦給數組a的函數內部的console.log(i),里面的i指向的就是全局的i。也就是說,所有數組a的成員里面的i,指向的都是同一個i,導致運行時輸出的是最后一輪的i的值,也就是 10。

    如果使用let,聲明的變量僅在塊級作用域內有效,最后輸出的是 6。

    var a = [];
    for (let i = 0; i < 10; i++) {
      a[i] = function () {
        console.log(i);
      };
    }
    a[6](); // 6

    上面代碼中,變量i是let聲明的,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以最后輸出的是6。你可能會問,如果每一輪循環的變量i都是重新聲明的,那它怎么知道上一輪循環的值,從而計算出本輪循環的值?這是因為 JavaScript 引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算。

    2018年5月13日 09:43
    編輯回答
    久舊酒

    http://www.cnblogs.com/wangfu... 去看看王福朋關于閉包的一系列解讀吧。適合新手,簡單易懂。

    2018年8月31日 03:39
    編輯回答
    護她命

    i是全局變量 調用a[6]()的時候去取i的值 這時候i早循環到10
    跟下面一個道理

    var i = 0;
    var a = function(){
        console.log(i)
    }
    i=10;
    a()//10

    調用的時候才去取值

    2017年8月2日 09:42
    編輯回答
    巴扎嘿

    js中沒有代碼塊的限制, 所以變量i就是一個全局變量

    2018年1月22日 07:58
    編輯回答
    別瞎鬧

    函數內相關的值是在執行時確定的。
    所以執行時去確定i,沒有傳入i的值,會去外層作用域找,此時i已經在遍歷完變成了10。
    跟閉包沒多大關系。

    2017年12月19日 04:44
    編輯回答
    悶油瓶

    去了解一下es6里面的let和var的區別就知道了

    2018年7月15日 23:08
    編輯回答
    放開她

    無論i是幾,a[i]();都是10,因為函數作用域變量的值是運行時確定的,不是定義時確定的,當函數執行的時候i已經++到10了。

    2017年11月1日 17:50
    編輯回答
    赱丅呿

    這個是考的var的作用域,你可以這樣試一下,應該就能明白了

    var a = []
    console.log(index) // undifined
    console.log(b) // b is not defined
    for (var index = 0; index < 10; index++) {
      a[index] = function() {
        // 此時無論這個方法內怎么寫都無所謂,不執行的
        console.log(index)
      }
    }
    a[6]() // 這時執行方法,而index已經for完成了
    2017年12月16日 18:59
    編輯回答
    舊酒館

    這是函數運行中 執行上下文環境壓棧入棧的過程。

    你不斷調用a[i], 都是從function(){ console.log(1) } 壓棧,然后 function(){ console.log(2) } 壓棧,然后function(){ console.log(3) }。一直到function(){ console.log(10) }壓棧
    
    http://www.cnblogs.com/wangfupeng1988/p/3992795.html
    可以看看這個系列
    2017年11月1日 06:26
    男生女生一起差差差带痛声,插曲的痛的视频30分钟,男生和女生在一起差差的视频