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

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

閉包問題:用指定字母集逐個替換字符串中的字符

閉包問題:用指定字母集逐個替換字符串中的字符

慕碼人2483693 2018-12-13 14:10:17
var arr = ['c', 'f', 'h', 'o']var str = "uih3eifu6wefhw8wefw6"var func = function(){    var count = 0    // func共執行四次,每次執行到這里的時候count不是被重新賦值為0了么,count是怎么保存func的執行次數的    return function(){        return arr[count++]    }}str.replace(/\d/g, func())不太理解,在這里外部定義的count變量是怎么保存func的執行次數的,這段代碼為什么可以實現,按照我的理解,每一次func執行的時候count不應該是0么
查看完整描述

1 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

這個和javascript的作用域以及作用域鏈有關。


當然想要徹底搞懂需要了解什么是執行環境,什么是活動對象。


舉個簡單的例子:(你可以試試下面,原理和你的一樣,簡化而已)


    function getFunc(num){

        var count = num;

        return function(){

            console.log(count++);

        }

    }

    var func = getFunc(1);

    func();// 1

    func();// 2

    func();// 3

    func();// 4

一個函數在調用的時候,會專揀一個執行環境,并且會創建相應的作用域鏈


getFunc() 調用的時候創建了一個執行環境,并且有一個作用域鏈,然后參數(arguments)會初始化函數的活動對象。


同時getFunc()返回了一個匿名函數,賦值給了func();


func()在調用匿名函數的時候,也會創建一個執行環境也有一個作用域鏈,在func()的作用域鏈中,getFunc()屬于func()的外部函數,因此外部函數的活動對象處在作用域鏈的第二位,然后依次類推,直到全局執行環境。


所以,在func()中使用了 count 變量,但是本身這個函數是沒有的,所以需要沿著作用域鏈繼續往上查找,直到找到位置,在他外部函數中發現了count,所以使用并且重新賦值。


這個過程,每執行一次func(),對count進行了重新賦值 count++,下一次 func() 會繼續找 getFunc() 中的count,這個count就上一個func()給改變了。


如果想更加細致的了解,可以閱讀《javascript高級教程》中關于函數表達式的部分


查看完整回答
反對 回復 2019-01-24
  • 1 回答
  • 0 關注
  • 536 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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