javascript - js中作用域和没有块级作用域两者,有点蒙圈了~
PHP中文网
PHP中文网 2017-04-10 15:58:56
0
5
699
    function test(){  
    for(var i=0;i<3;i++){  
    var what = "haha";   
      } console.log(what);  
    }  
    test();

上面这个打印what可以出来haha

function enen(){
    var that = "lala";
}
console.log(that);

这个则打印不出来,显示that未定义

疑问:
that是放在enen()函数里面的,外部不可访问我理解。
what不也是放在 test()函数里面的吗?难道what外层加了个for循环,就不算包含在test()里面了?

PHP中文网
PHP中文网

认证0级讲师

reply all(5)
小葫芦

关于第一个函数: console.log(what); 语句访问what变量,此时what虽然在for循环里面,但是它们在同一个作用域里面啊(test函数对应的作用域)。
关于第二个函数: what在enen作用域里,而console.log(what)访问的what是从enen作用域外检索的,所以检索不到,结果未定义咯。
如果第一个函数按照下面方式写,打印出的what也是未定义:

function test(){
 for(var i=0;i<3;i++){  
   var what = "haha";   
  } 
}  
console.log(what);  
test();

最后,纠正下@Carlis_Liu的一句描述: js能划分作用域的只有function 。 这是不正确的,开辟作用域的还有 with、try....catch等

迷茫

后面那个that的作用域只在他function内部

大家讲道理

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

PHPzhong

js有一种东西叫函数作用域

伊谢尔伦

你在test函数内部定义的what变量,然后在test函数内部访问,当然能访问到

Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template