2 回答
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循环之内,为块级作用域
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。
function test(){
(function(){ //匿名函数中定义的所有变量都会在执行结束时被销毁
for(var i=0;i<5;i++)
alert(i);
})()
alert(i);//报错,不识别i
}
test();
此时定义在匿名函数中的for循环,在函数阶数后就销毁i,此时代码alert('last_i:'+i)运行就会报错。这样就和其他语言中的块级作用域一样。
怎样实现js的块级作用域呢?那就是匿名函数。在匿名函数中定义的任何变量都会在执行结束后销毁,这样就很类似其他语言中的for循环中的i在执行循环后销毁i。此处的匿名函数是要自执行的,也就是(function(){......})()这种形式,两个()(),前一个放函数体,后一个代表‘执行’的意思,就像普通的函数调用,当然了也可以放参数如:(函数体)(参数)。用匿名函数模仿块级作用域的代码如下:
[html] view plain copy
添加回答
举报