2016-03-19 34 views
0

我得到的结果与JavaScript变量重新定义不一样。我查了一下变量作用域不是孤立的,所以我的问题是,它怎么能被隔离,以便不会导致与其他代码的冲突。在javascript中分离范围

var test = "value"; 
var a = true; 
if(a){ 
    console.log(test); 
    var test = "another"; 
    console.log(test); 
} 
console.log(test); 

大多数人会想到:

value 
another 
value 

但实际:

value 
another 
another 
+0

使用'let'而不是'var'。或者如果您需要支持旧版浏览器(旧IE),请使用IIFE。 – nnnnnn

+0

*我抬头看,变量范围不是孤立的*你在哪里看起来? –

+0

为什么你需要相同的变量名?只需使用其他名称。 – Thevs

回答

0

var声明的变量函数作用域。

如果你想阻止范围,ES6介绍let

let test = "value"; 
let a = true; 
if(a) { 
    console.log(test); // ReferenceError 
    let test = "another"; 
    console.log(test); // "another" 
} 
console.log(test); // "value" 

let变量仍然悬挂。因此,如果您在创建之前参考(temporal dead zone),您将得到一个ReferenceError而不是父范围中的值。

+0

好的感谢,虽然从谷歌android safari moble和safari桌面现在不支持。 – InCode

+1

@InCode然后你只有'var',这是函数作用域。考虑将这个块包装在一个IIFE中。 – Oriol

1

我抬头变量范围并不孤立

你在哪里看这事呢?每个JS教程和帮助页面都清楚地表明,使用var声明的变量具有函数范围

我对开始JS程序员的表面看起来很迷惑,提出了范围和提升的问题。正确的方法是:

  1. 声明你的变量在你所属函数的顶部。几乎所有的风格指南,如果你遵循一个,无论如何需要这个。几乎所有棉绒,如果您使用棉绒,将或可以配置为强制执行此操作。

  2. 花你计划用于担心提升,变量范围和临时死亡区的时间,而不是去读一本书,遛狗,或者实际上做有用的编码。

  3. 过着漫长而幸福的生活。

如果由于某种原因,你有变量作用域为块(任何内部{},如iffor语句体)是很重要的,那么,使用let。在现实世界中,我认为你会发现这样的例子很少,除非你正在编写包含数十或数百行的巨大函数,这是不好的做法。在这种情况下,再次遵循最佳做法,并在块的顶部声明所有变量。

如果您没有let可用,并且想要在块内使用另一个同名变量,那么刚刚使用另一个变量呢?例如,在您给出的示例中,在if区块内使用test1而不是test。这实际上是巴贝尔在封面下做的。它transpiles

function f() { var x; { let x; } } 

function f() { var x; { var _x; } } 
          ^^ 

你会看到它已改名为内x_x

你的问题基本上相当于想知道为什么当你在你的眼睛里贴针时疼。不要担心不同种类的针头会粘在你的眼睛里,也不会担心由此产生的疼痛的生物学机制,为什么不停止将针头粘在眼睛上呢?