猿问

为什么JavaScript没有块级作用域

为什么JavaScript没有块级作用域


烙印99
浏览 738回答 2
2回答

LEATH

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循环之内,为块级作用域

米琪卡哇伊

js中在一个函数中定义一个for循环:for(var i=0;i<5;i++) 其中的i并不会随着for循环的结束就销毁,i会一直存在该函数中,这就是js和其他语言的区别,也就是js没有块级作用域的概念。看以下代码:[html]&nbsp;view plain&nbsp;copyfunction&nbsp;test(){&nbsp;&nbsp;for(var&nbsp;i=0;i<5;i++)&nbsp;&nbsp;{&nbsp;&nbsp;alert(i);&nbsp;&nbsp;}&nbsp;&nbsp;alert('last_i:&nbsp;'+i);&nbsp;&nbsp;}&nbsp;&nbsp;test();&nbsp;&nbsp;运行以上代码,执行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]&nbsp;view plain&nbsp;copyfunction&nbsp;test(){&nbsp;&nbsp;(function(){&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//匿名函数中定义的所有变量都会在执行结束时被销毁&nbsp;&nbsp;for(var&nbsp;i=0;i<5;i++)&nbsp;&nbsp;alert(i);&nbsp;&nbsp;})()&nbsp;&nbsp;alert(i);//报错,不识别i&nbsp;&nbsp;}&nbsp;&nbsp;test();&nbsp;&nbsp;此时定义在匿名函数中的for循环,在函数阶数后就销毁i,此时代码alert('last_i:'+i)运行就会报错。这样就和其他语言中的块级作用域一样。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答