请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

请问老师关于作用域

请问下老师关于函数的赋值是什么样的规则,我之前一直理解的是函数体的赋值仅仅是类似string类型的赋值。用老师的代码打比方

https://img1.sycdn.imooc.com//szimg/5fb66ff8097e391215540616.jpg

这个例子,当外部调用传入cancel为c的时候。仅仅是函数体的赋值我理解为类似字符串类型的赋值,当外部去运行cancel的时候,当前作用域下找不到所谓的resolvePromise这个函数。按照我的理解应该会报TypeError。函数赋值的执行机制以及作用域老师方便解释一下吗,感觉这里自己之前一直理解的不对。

正在回答 回答被采纳积分+3

3回答

提问者 hy_wang 2020-11-19 22:40:22

老师我画了张图,我理解是因为这样的作用域所以外部调用cancel函数的时候就相当于访问了contractor构造函数中的函数,所以产生了闭包从而访问到不属于exector函数中的自由变量(调用并非自身resolvePromise函数)。

那也就是说闭包不一定是return形式的返回函数,像老师这样的写法利用参数传递函数也是属于闭包。是这样吗

https://img1.sycdn.imooc.com//szimg/5fb6834609d37c1a35842240.jpg


0 回复 有任何疑惑可以回复我~
  • 闭包简单说就是函数套函数,形成闭包,你可以这么简单的理解:把 c 赋值给 cancel,cancel 就是一个指针,指向了 c 这个函数。
    回复 有任何疑惑可以回复我~ 2020-11-20 11:31:37
  • 提问者 hy_wang 回复 ustbhuangyi #2
    嗯嗯,谢谢老师
    回复 有任何疑惑可以回复我~ 2020-11-20 13:57:38
提问者 hy_wang 2020-11-19 22:14:11

老师我大概想通了,实质上还是因为闭包的原因所以函数能访问到内部的函数。闭包不仅仅针对于变量,只要是非当前作用域的任何东西(函数,变量等)都算作闭包。

至于我的例子,因为我给fn1重新赋值了也就是重新开辟了一块新的引用地址所以它改变了指向所以才会test和fn1不一致的情况。


也就是实质上老师课程中还是的cancel函数还是利用闭包的特性,从而外部调用时候的参数c可以访问到函数内部的作用域。以及cancel=c实质还是引用类型的赋值指向了同一块引用地址,所以调用cancel()方法的时候我理解是有两部:

  1. 首先因为引用类型的赋值cancel实质就是指向了c函数。

  2. 其次因为闭包的原因,c函数是一个内部函数所以触发了闭包它可以访问构造函数中的自由变量(不仅仅是变量以及函数)。

    请问老师我这样理解正确吗

0 回复 有任何疑惑可以回复我~
提问者 hy_wang 2020-11-19 21:40:32

老师我自己写了一个demo,函数的赋值的确是和字符串类型相同啊,并非object那样指向同一个堆地址。

https://img1.sycdn.imooc.com/szimg/5fb6751009e46b9608520768.jpg

打印结果:

https://img1.sycdn.imooc.com//szimg/5fb6753009d400df09900756.jpg

请老师解惑这究竟是为什么,我尝试从词法作用域角度以及引用地址角度分析都没有想通。因为是直接赋值了一个函数体变量,为什么课程中的cancel方法体会访问到内部的方法体。感觉像是闭包但是并不清楚应该怎么解释的通

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信