扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
这篇文章主要讲解了“JS变量作用域是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS变量作用域是什么”吧!
创新互联是一家集网站建设,班玛企业网站建设,班玛品牌网站建设,网站定制,班玛网站建设报价,网络营销,网络优化,班玛网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
变量的作用域,指的是变量在脚本代码中的可读、可写的有效范围,也就是脚本代码中可以使用这个变量的区域。在ES6之前,变量的作用域主要分为全局作用域、局部作用域(也称函数作用域)两种;在ES6及其之后,变量的作用域主要分为全局作用域、局部作用域、块级作用域这3种。相应作用域变量分别称为全局变量、局部变量、块级变量。全局变量声明在所有函数之外;局部变量是在函数体内声明的变量或者是函数的命名参数;块级变量是在块中声明的变量,只在块中有效。
变量的作用域跟声明方式有密切的关系。使用var声明的变量的作用域有全局作用域和局部作用域,没有块级作用域;使用let和const声明的变量有全局作用域、局部作用域和块级作用域。
注:严格意义的全局变量都属于Window对象的属性,但let和const声明的变量并不属于Windows对象,所以它们并不是严格意义上的全局变量,在此仅仅从它们的作用域这个角度来说它们是全局变量的。
由于var支持变量提升,所以var变量的全局作用域是对整个页面的脚本代码有效;而let和const不支持变量提升,所以let和const变量的全局作用域指的是从声明语句开始到整个页面的脚本代码结束之间的整个区域,而声明语句之前的区域是没有效的。同样,因为var支持变量提升,而let和const不支持变量提升,所以使用var声明的局部变量是在整个函数有效,而使用let和const声明的局部变量从声明语句开始到函数结束之间的区域有效。需要注意的是,如果局部变量和全局变量同名,则在函数作用域中,局部变量会覆盖全局变量,即在函数体中起作用的是局部变量;在函数体外,全局变量起作用,局部变量无效,此时引用局部变量将出现语法错误。在块开始到块级变量声明语句之间区域为暂时性死区,在这个区域,块级变量没有效。
另外,在非严格运行模式中,变量可以不需要声明,这些没有声明的变量,不管在哪里使用都属于全局变量。通常不建议变量不声明而直接使用,因为这样有可能会产生一些不易发现的错误。
上述脚本代码分别声明了4个全局变量、3个局部变量和1个块级变量。在scopeTest函数体外,变量v1、v2、v3和v4为全局变量;在scopeTest函数体内,lv、v2是全局变量;在if判断块中,lv是块级变量。我们看到,局部变量v1和v2与全局变量v1和v2同名,在scopeTest函数体内,局部变量v1和v2有效,因而在函数体这2个变量的输出结果分别为bbb和ccc;在函数体外全局变量v1和v2有效,因而在函数体外,这2个变量的输出结果分别为JavaScript和JScript。另外,块级变量lv和局部变量lv同名,在if判断块中,块级变量lv有效,因而在块中输出的结果为123,而在块外,局部变量lv有效,lv变量的输出结果为aaa。另外,全局变量v3和v4在函数体中没有被覆盖,因而输出的是全局变量的值,所以v3在函数体外和体内输出结果都是Script,而v4变量的赋值在函数调用的后面,因而在函数体中的v4输出结果为undefined,而在函数体外的输出是在声明之后,所以结果为VB。lv是局部变量,因而在函数体外访问会报ReferenceError错误。
总结:块级变量在块内覆盖局部变量,局部变量在函数体内覆盖全局变量,没有被覆盖的全局变量在函数体内、外都有效。
感谢各位的阅读,以上就是“JS变量作用域是什么”的内容了,经过本文的学习后,相信大家对JS变量作用域是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流