素材牛VIP会员
javascript作用域的问题,就是内嵌函数访问外层函数变量的问题,求大神指导我?
 龙***爸  分类:Node.js  人气:1485  回帖:15  发布于6年前 收藏

众所周知,在javascript中,内嵌函数,可以访问所有外层函数的变量,这个是由著名的js作用域链实现的,但是我只是从语法特性的角度去理解这个知识点的,不知道里面具体原理是什么呢?
就比如,我们在chrome中去尝试这个访问:

我们发现:height变量压根不存在,肯定为not available,但是局部变量textVar和count也是not available;color作为全局变量可以访问到,值就是red。
下面是firefox里面的测试结果:

firefox中,height变量height is not defined很好理解,但是textVar和count爆出错误variable has been optimized out是什么意思?

我们稍微修改下代码:

这次,我们特意在内嵌函数里面访问下count变量,count变量的值在Watch里面正确读取到了,但是textVar依旧没有被访问到,相对于上面那个测试,是不是很奇怪?js解释引擎到底怎么处理类似逻辑的?
下面是firefox里面的测试结果:

这个测试结果和chrome测试结果保持一致,就不累述了。

为了进一步研究,我们写nodejs测试,用webstorm对nodejs代码调试:

看了一下Watchers,发现nodejs简直丧心病狂,全局变量color都变得不可访问了。
仿照上面的套路,我们在函数里面显式访问textVar,结果是:

显式访问textVar变量,textVar在Watchers里面访问到了。


很多小伙伴认为我在讨论闭包问题,我在此申明下,我讨论的是js作用域链问题:

不是闭包吧,还是一样的测试结果!!!我讨论的是js作用域链的问题,探究的是js作用域的底层实现,虽然是个小美工,但是想跟你们多学点东西嘛。

 标签:node.jsjavascript

讨论这个帖子(15)垃圾回帖将一律封号处理……

Lv3 码奴
ou***un JS工程师 6年前#1

没有研究过watch的具体实现方式

应该和前面几位说的差不多,属于浏览器/解析器上的优化,

当前scope中没有使用到的变量,会被优化掉

Lv6 码匠
xi***uX 站长 6年前#2

这个是执行栈的问题。

上面,return了一个方法赋给了一个全局变量。作用域还是在的,只不过这个返回方法的执行栈脱离了原本方法的执行栈,这就是闭包。Chrome的watch是基于当前栈的,所以找不到。建议还是学习下闭包。

下面那个例子,也是这个问题。。
在内部执行的方法中,是没有b的,这只是执行栈没有用到,但是作用域链上是有的。

也可以看到b
只要你改下Call Stack就好了,在外部执行栈内,还是有b的。

Lv1 新人
ze***an UI设计师 6年前#3

感觉问题没有描述清楚啊。没看懂。

Lv4 码徒
非***星 其它 6年前#4

就是闭包里返回的函数里没有你要的变量而已。
楼主很有探索精神,值得学习,加油!

Lv2 入门
馨***茂 站长 6年前#5

本来看到这个问题的,没有回答,但是别人邀请回答了,那就说两句。
首先,你这么书写跟作用域链(不知道你说的是不是原型链)没有任何关系,你这样定义的变量是不会绑定到prototype上的。

这个跟闭包有一定的关系,因为闭包很容易导致内存泄露(这其实不是闭包的问题),所以浏览器做了一定的优化(很多人也提到的)。

可以参考这里:
http://stackoverflow.com/questions/26776...
(尤其是下面这篇)
http://stackoverflow.com/questions/28388...

上一页12下一页
 文明上网,理性发言!   😉 阿里云幸运券,戳我领取