为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕码人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 关注
  • 525 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信