search

Home  >  Q&A  >  body text

javascript - js中作用域和没有块级作用域两者,有点蒙圈了~

    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中文网2776 days ago700

reply all(5)I'll reply

  • 高洛峰

    高洛峰2017-04-10 16:00:56

    关于第一个函数: 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等

    reply
    0
  • 迷茫

    迷茫2017-04-10 16:00:56

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

    reply
    0
  • 大家讲道理

    大家讲道理2017-04-10 16:00:56

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

    reply
    0
  • PHPz

    PHPz2017-04-10 16:00:56

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

    reply
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-10 16:00:56

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

    reply
    0
  • Cancelreply