为了账号安全,请及时绑定邮箱和手机立即绑定

为什么JavaScript没有块级作用域

为什么JavaScript没有块级作用域

烙印99 2019-04-15 08:08:03
为什么JavaScript没有块级作用域
查看完整描述

2 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

js能划分作用域的只有function,块级作用域指的是定义在条件或循环分支中的,像你举的这个函数例子,test定义在for循环之内,再for循环之外也能访问what变量 (这是js的变量提升,可以查一下,它会把what提升到test函数的最开头定义)function test(){
for(var i=0;i<3;i++){
var what = "haha";
} console.log(what);
}
test();

如果你这段代码换成Java的,是下面这样的:private void test(){
for(int i=0;i<3;i++){

String what =“123";
}
System.out.println(what);

这个方法是编译不通过的,因为what的作用域只在for循环之内,为块级作用域

查看完整回答
反对 回复 2019-04-16
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

js中在一个函数中定义一个for循环:for(var i=0;i<5;i++) 其中的i并不会随着for循环的结束就销毁,i会一直存在该函数中,这就是js和其他语言的区别,也就是js没有块级作用域的概念。看以下代码:

[html] view plain copy

  • function test(){  

  • for(var i=0;i<5;i++)  

  • {  

  • alert(i);  

  • }  


  • alert('last_i: '+i);  

  • }  

  • test();  




  • 运行以上代码,执行for循环会弹出5次窗口分别为0,1,2,3,4。执行到4意味着for循环结束,其他语言下i就会销毁,执行alert(‘last_i:’ +i)按理说会为undefined,但js中不是,i会一直存在函数中,也就是说执行到alert(‘last_i :’ +i)时会弹出last_i: 5 。而这个5就是经过for循环累加后的i。

  • 怎样实现js的块级作用域呢?那就是匿名函数。在匿名函数中定义的任何变量都会在执行结束后销毁,这样就很类似其他语言中的for循环中的i在执行循环后销毁i。此处的匿名函数是要自执行的,也就是(function(){......})()这种形式,两个()(),前一个放函数体,后一个代表‘执行’的意思,就像普通的函数调用,当然了也可以放参数如:(函数体)(参数)。用匿名函数模仿块级作用域的代码如下:

    [html] view plain copy

  • function test(){  

  • (function(){       //匿名函数中定义的所有变量都会在执行结束时被销毁  

  • for(var i=0;i<5;i++)  

  • alert(i);  

  • })()  

  • alert(i);//报错,不识别i  

  • }  

  • test();  



  • 此时定义在匿名函数中的for循环,在函数阶数后就销毁i,此时代码alert('last_i:'+i)运行就会报错。这样就和其他语言中的块级作用域一样。



查看完整回答
反对 回复 2019-04-16
  • 2 回答
  • 0 关注
  • 737 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信