当前位置: 首页 > 后端技术 > Node.js

Javascript变量作用域详解

时间:2023-04-03 19:53:52 Node.js

Javascript变量作用域详解JS作用域规则JS在大多数情况下是没有块级作用域的,除非你使用let当你使用var时,JS只支持函数作用域,不使用var,let声明的变量是全局变量。在let的情况下,JS中的局部变量只能通过var和函数参数来声明。1.JS在大多数情况下是没有块级作用域的,除非你使用let。与许多语言不同,JS在ES6之前没有块级作用域:functiontest(){//ascopefor(vari=0;i<10;i++){//notascope//count}console.log(我);//10for(letj=0;j<10;j++){//是一个独立的范围//count}console.log(j);//jisnotdefined}在这个例子中,i不仅仅存在于for循环的区域,而是存在于整个测试函数中。如果我们用let声明变量i,i有块级作用域2。当你用var时,JS只支持函数作用域。刚才说了在ES6之前JS是没有块级作用域的,那什么是作用域呢?答案是functionscope.functiontest(){vara='hello'}test()console.log(a)//aisnotdefined在这个例子中,函数内部声明的变量a作用域被限制在在函数内部,所以我们不能在函数外部访问它。3、不使用var,let声明的变量是全局变量。如果我们在上面的例子中删除var会发生什么?functiontest(){a='hello'}test()console.log(a)//hello4.没有let,JS中的局部变量只能通过var和函数参数来声明。从上面的分析,我们知道函数内部声明的变量作用域是函数中的局部变量//Exp1:典型错误示例for(vari=0;i<10;i++){setTimeout(function(){console.log(i);},1000);}//101010...//Exp2:使用setTimeout函数传入参数for(vari=0;i<10;i++){setTimeout(function(i){console.log(i);},1000,i);}//1234...//Exp3:使用bind传入函数参数for(vari=0;i<10;i++){setTimeout(function(i){console.log(i);}.bind(null,i),1000);}//1234...//Exp4:利用闭包的特性传入参数varcb=function(i){returnfunction(){console.log(i)}}for(vari=0;i<10;i++){setTimeout(cb(i),1000);}//1234...后三个例子看似无关,但原理是一样的:把变量当作函数参数传递给函数,这样变量在函数中具有局部作用域而不是全局作用域。当然,这其实是JS设计上的一个缺陷。在ES6时代,我们只需要通过let创建具有快速作用域的变量就可以轻松解决以上问题。//Exp5:使用let为(leti=0;i<10;i++)创建块级作用域参数{setTimeout(function(){console.log(i);},1000);}//123...