js的作用域、预解析机制(详细教程)

本篇文章主要给大家详细分析了js的作用域预解析机制以及相关代码分析,对此感兴趣的朋友学习下吧。

虽然,ES6在我们工作中应用得越来越广泛,但是还是很多项目保留着ES5的写法,所以,今天,带着大家重新巩固下ES5下的作用域及预解析机制。

概念:

作用域:域,指的是一个空间、范围、区域,作用指的是在域内可进行读写操作。一个变量的作用域是程序源代码中定义的这个变量的区域。

在ES5中,只存在全局和函数级作用域,在ES6中,引入了块级作用域,js的预解析机制大概分为两个过程:预解析和自上而下逐行解读

预解析:js解析器会先把var定义的变量、function、参数等一些东西存储进仓库里面(内存)。变量var在正式运行之前,都赋值为undefined,function函数在运行之前,就是整个函数块

逐行解读

表达式=、+、-、*、/、++、–、!、%…..number()、参数都可以赋值

遇到重名的,只留下一个,变量和函数重名,函数优先级高于变量,只留下函数

函数调用(函数是一个作用域,遇到作用域都会按照先进行预解析,然后逐行解读的过程执行),先局部找参数,局部找不到就自下向上找(作用域链)

概念扯了一大段,估计初学者还是有点晕乎乎,老司机就可以提前下车了,接下来,咋们举几个小栗子,结合上面的理论,深入理解。

实践

例1:

alert(a); //error: a is not defineda = 3;

登录后复制

分析:

预解析

上面说过,预解析时只会把var 、 function 、参数等存储起来,所以:

整个作用域没有找到var function 参数

逐行解读

预解析后,内存中存在a且被赋值了underfind整个变量,所有,代码执行过程中程序直接报错。

例2:

alert(a); //undefinedvar a = 3;

登录后复制

分析:

预解析

上面说过,预解析时只会把var 、 function 、参数等存储起来,所以:

执行到第二行时,a 的值是未定义。

逐行解读

第一行:预解析后,内存中存在a且被赋值了underfined

例3:

alert(a);          // function a (){ alert(4); }var a = 1;alert(a);          // 1function a (){ alert(2); }alert(a);          // 1var a = 3;    alert(a);          // 3function a (){ alert(4); }alert(a);          // 3

登录后复制

分析:

域解析

上面说过,预解析时只会把var 、 function 、参数等存储起来,所以:

执行到第二行时,a 的值是未定义。

执行到第四行时,a 的值是函数本身,也就是function a(){alert(2);}。

执行到第六行时,a 的值还是第四行时的值,也就是function a(){alert(2);},因为函数的优先级比变量高。

执行到第八行时,a 的值就变成了function a(){alert(4);} ,因为当两个函数重名时,遵循代码从上往下执行。

逐行解读

预解析完成之后,就是代码逐行执行了,

第一行:会弹出function a(){alert(4);} ,因为预解析完成之后,被存进内存的a 的值就是function a(){alert(4);}

第二行:第二行里有表达式,a 被赋了一个新的值1 表达式会改变变量的值。表达式可以改变预解析的值。

第三行:a现在被赋值为1,所有会弹出1

第四行:只是函数的声明,并没有用到表达式,而且也没有函数的调用,所以不会改变a 的值。

第五行:因为a的值没有变化,所以还是1

第六行:使用了表达式,a 被赋了一个新的值3

第七行:会弹出3

第八行:函数的声明,不会改变a 的值。

第九行:a的值没有改变,所以还是3

通过上面的栗子,相信大家应该对变量作用域的预解析过程有一定的了解了,接下来,咋们再举几个函数作用域的栗子

例4:

var a=1;function fn1(){  alert(a); //undefined  var a = 2;}fn1();alert(a) //1

登录后复制

例5:

var a=1;function fn1(a){  alert(a); //1  var a = 2;}fn1(a);alert(a) //1

登录后复制

例6:

var a=1;function fn1(a){  alert(a); //1  a = 2;}fn1(a);alert(a) //1

登录后复制

例7:

var a=1;function fn1(){  alert(a); //1  a = 2;}fn1(a);alert(a) //2

登录后复制

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

在jquery中如何动态添加带有样式的HTML标签元素

在jquery中如何动态添加带有样式的HTML标签元素

在jquery中如何动态添加带有样式的HTML标签元素

以上就是js的作用域、预解析机制(详细教程)的详细内容,更多请关注【创想鸟】其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/3187237.html

(0)
上一篇 2025年3月31日 23:06:55
下一篇 2025年3月31日 23:07:03

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • PHP中如何传递闭包变量?

    在php中传递闭包变量使用use关键字。1)通过use关键字引入外部变量到闭包内。2)闭包捕获变量的引用或值,引用会随外部变量变化。3)闭包访问定义时作用域变量,不能访问调用时作用域变量。 谈到PHP中如何传递闭包变量,这个问题其实涉及到P…

    2025年4月27日
    000
  • 如何声明一个PHP变量?

    在php中声明变量使用美元符号($)后跟变量名,例如$myvariable = “hello, world!”。php变量具有动态类型,可以灵活转换,但需注意类型变化,添加类型检查,使用类型声明和严格模式,谨慎使用全…

    2025年4月27日
    000
  • PHP中常量和变量有什么区别?

    常量和变量在php中的主要区别在于:1. 常量的值不可改变,而变量的值可以被重新赋值;2. 常量是全局的,而变量受到作用域限制;3. 常量命名通常使用大写字母和下划线,变量命名则更为灵活;4. 常量的解析速度比变量快,这些区别影响了它们在代…

    2025年4月27日
    000
  • PHP中global关键字怎么用?

    global关键字在php中用于在函数内部访问全局变量。1. 使用global关键字将全局变量引入函数作用域内,允许读写操作。2. 尽量少用global关键字,因为过度使用会降低代码的可维护性和可读性。3. 在函数内使用时,明确操作的是全局…

    2025年4月27日
    000
  • JS实现简易版贪吃蛇小游戏

    nbsp;html PUBLIC “-//W3C//DTD XHTML 1.0 Strict//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd”>    新建网页     …

    编程技术 2025年4月4日
    200
  • Java框架性能优化:避免常见的错误

    通过避免常见的错误优化 java 框架的性能至关重要。这些错误包括:未进行懒加载,使用非索引查询,未缓存查询结果,过度使用事务,未对线程池进行优化。为了提高性能,请使用 @lazy 注解进行懒加载,创建索引以提高查询速度,缓存查询结果以减少…

    2025年4月2日
    200
  • java怎么传参数

    Java中参数传递有两种方式:值传递(传递副本,修改原值不影响副本)、引用传递(传递对象引用,修改副本也会影响原对象)。 Java中如何传递参数 Java中传递参数有两种主要方式: 1. 值传递 值传递是最常见的方式。这意味着传递的参数是原…

    2025年4月2日
    200
  • java闭包怎么回调

    Java 中利用匿名内部类实现闭包,允许访问外部变量。通过闭包可实现回调,即在事件触发时调用指定函数。步骤如下:定义闭包:使用匿名内部类实现接口或抽象方法,并带回调函数参数。访问外部变量:闭包可访问定义其作用域之外的变量。设置回调:将闭包作…

    2025年4月2日
    100
  • java变量怎么用

    Java 变量用于存储值,需要先声明类型和变量名,然后赋值。声明变量类型时可以使用指定数据类型或不指定让编译器推断。变量名以字母开头,由字母、数字和下划线组成。赋值使用 (=) 运算符,赋值的右侧可以是常量、表达式或其他变量。变量的作用域有…

    2025年4月2日
    200
  • eclipse如何断点调试

    Eclipse 提供了强大的断点调试功能,允许用户在代码中设置断点,在程序执行到该点时暂停程序,以便检查变量和其他信息。通过单击代码行号左侧的空白区域或右键单击代码行号并选择“切换断点”,可以在编辑器中设置断点。断点属性对话框提供了配置条件…

    2025年4月2日
    200

发表回复

登录后才能评论