2014-11-20 22 views
1

看来JS strict mode不允许声明隐式全局变量,但不影响在条件(if)或循环(while)中定义的变量的访问。在C#中,您无法访问在外部条件或循环内声明的变量。在JavaScript中,然而,以下工作:本地/ web服务器和JS Bin测试之间的好奇区分差异

 "use strict"; 
     (function() { 
      var mybool = true; 
      if (mybool) { 
       var test = "test;  
       console.log(test);  //"test" 
      } 
      console.log(test);   //"test" 
     }()); 

breaks in JSBin和的jsfiddle,说test1超出范围。

为什么它在我的网络服务器上工作,但在其他地方打破了?什么是在条件和循环等范围内的规则?JavaScript是否应该像C#这样?

回答

1

我认为你越来越严格的模式和JSHint错误困惑。

在JSBin,JSHint is issuing the 'test1' used out of scope error。这与严格模式无关。在你的网络服务器上,一切正常,因为严格模式对这种可变范围问题没有意见。 JSBin为你运行JSHint,你的web服务器可能不是。

在条件和循环等范围内的规则是什么... JavaScript应该像C#这样?

号JavaScript有没有块范围,但它确实有功能范围。这意味着如果一个变量在块内声明(如if语句或循环结构),它的声明将被“悬挂”到函数的顶部。查看variable declaration hoisting的更多文章。

特别是对于你的代码,它的解释,就好像你写这样的:

(function() { 
    var mybool = true, 
     test; /* = undefined */ 

    if (mybool) { 
     test = "test;  
     console.log(test);  //"test" 
    } 
    console.log(test);   //"test" 
}()); 

为了避免这种混乱在JavaScript中的范围,这是一个good practice声明所有变量在他们所在的函数的顶部(因为这是他们实际上确定了范围的地方)。

+0

Yeap我在中途意识到这与'use strict'无关' - 我以为JSBin可能使用'use strict;'这是导致两者之间的问题。感谢你! – Growler 2014-11-20 21:00:19

+0

@Growler:没问题,很乐意帮忙 – 2014-11-20 21:02:43

相关问题