javascript作用域链-Javascript变量的作用域和作用域链的解释

2024-04-23 0 4,240 百度已收录

工作这几年,JS学得不是很好。 刚好放假有点空闲,干脆买了一本Rhino大名鼎鼎的《JS权威手册》javascript作用域链,好好深入了解了一下JS。 买这本书给我的第一感觉是很厚,但是前半部分只是参考指南。

1:范围

说到变量,首先要谈的肯定是作用域。 正是因为我们对JS的作用域不熟悉,所以我们常常忽略了面向对象的作用域。 虽然有些东西习惯性的总是这样,并不是每次都可以模仿,那么接下来的问题来了,js 的作用域是什么? 它实际上是函数作用域。 我们的浏览器是一个实例化的窗口对象。 如果在window下定义了一个name数组,这样该name数组就具有window的函数作用域,即在window下可以访问它。 如果window下定义了一个函数ctrip,然后上面定义了一个名字,那么新定义的名字只能在ctrip函数下使用。javascript作用域链,作为反例,旧名称在 window 下仍然常见。

从图中可以看出两点:

1:在window下定义了名称后,还可以在function下定义同名的名称。 这在C#中是不可想象的。

2:JS下可以瞎。 它只识别自己的范围,所以出现了第一个“第二”。 你可能觉得这没什么奇怪的。 这是因为你可能还没有真正理解它。 功能范围是什么? 解析器执行ctrip时,首先会搜索ctrip下的所有局部变量,然后执行后续语句。 由于是先查找,所以var这句话在ctrip的任何地方都有定义。 一切皆有可能。 我们把下面的句子颠倒一下。

可以看到ctrip函数下,第一个console.log输出是未定义的。 这个结果可以否定。 我们做的第一件事是收集局部变量名称。 有人可能会问为什么不设置为“第二”。 那么这是因为初始化操作必须一句一句的执行,所以在ctrip函数中执行console.log(name)时,解析器只知道有一个没有形参的变量名,所以当它是undefined时安慰。

2:作用域链

从里面的例子我们也清楚的知道,函数中定义的变量只在函数的作用域内有作用域。 同时我们也看到前面的例子只是一层嵌套。 窗口是一个大函数。 以上是对于一个ctrip函数来说,同样的原理可以扩展到多层嵌套,比如三层、四层。 。 。 。 N层,这一层创建了一个链式结构。

javascript作用域链-Javascript变量的作用域和作用域链的解释

从图中可以听出来,我在ctrip下定义了一个plane函数。 在本例中,存在三层。 输出的结果就是我们想要听到的。 每层的名称仅在其自己的范围内。

10秒就生效了,出现下面的问题。 我已经脑死亡三天了。 定义plane的函数时,忘记把var写在var里了。 此时,plane 中的 var

name的值有哪些? 是第一还是第二?

复制代码代码如下:

javascript作用域链-Javascript变量的作用域和作用域链的解释

变量;

函数ctrip(){

变量;

函数平面(){

控制台.log(名称);

飞机();

控制台.log(名称);

携程网();

控制台.log(名称);

现在就考验你是否真正理解了作用域链。 仔细想想,你会发现,当代码执行到plane函数中的name="third"时,你会发现plane函数中没有局部变量名,而代码恰好在ctrip中在这个大函数中,解析器将返回ctrip函数来查找名称。 当发现有名字时,将ctrip的名字改为“third”。

三天后,我喝多了,又失去了理智。 定义平面函数时,我错误地写成了name="third",而不是nam="third"; 我丢了一个e。 你可以说这是一个酒精问题。 ,

这不是我的代码的问题。 解析器应该如何处理这个问题? 同样的,当我回溯的时候,发现携程已经不在了。 然后我又回到顶楼的窗户处,发现它仍然不在那里。

这时候解析器就已经做到了这一点。 由于整个链中没有形式参数,所以我无法向您报告错误。 那会很尴尬,所以我就简单地在窗口下为你隐式定义它。

nam变量,虽然此时nam是一个全局变量。 我们可以在窗口顶层的控制台中查看nam。

好了,关于变量的事情就这么多了,没有什么奇怪的,理解了也没有多大意义。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 javascript javascript作用域链-Javascript变量的作用域和作用域链的解释 https://www.wkzy.net/game/200730.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务