猿问

闭包问题:用指定字母集逐个替换字符串中的字符

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么


慕码人2483693
浏览 526回答 1
1回答

梦里花落0921

这个和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高级教程》中关于函数表达式的部分
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答