2014-08-30 116 views
4

考虑下面的代码:声明变量,如果和使用外

var factory = function(someCondition) { 
    var para1 = 'some value'; 
    if(someCondition) 
     var para2 = 'some other value'; 

    return new MyClass(para1, para2); 
} 

我知道这个代码是perfectly legal,即使para2声明的if内部,而是外部使用。

我的问题是:这是 - 虽然合法 - 由主要的JavaScript风格指南认为是不好的风格?如果是这样,通过哪些方法以及建议的替代方案?

只是要清楚:我知道关于提升和变量不是作用域而是函数作用域的事实。

+0

关于近距离投票:我将其改述。它不再基于你的意见。 – 2014-08-30 08:16:57

+2

我看到并收回了我的投票。做得好。 – 2014-08-30 08:17:20

+1

@FrédéricHamidi:感谢您帮助我更好地提出问题:) – 2014-08-30 08:18:06

回答

3

这不应该是一个坏的风格,这可能有点混乱。

任何方式的JavaScript会像下面这样做,因为hoisting,所以更好的写也像下面的。

var factory = function(someCondition) { 
    var para1 = 'some value'; 
    var para2; //declare it here 
    if(someCondition) 
     para2 = 'some other value'; //assign the value here 

    return new MyClass(para1, para2); 
} 

的ES6版本引入一个新的关键字赋予变量块作用域。

+0

这并没有真正回答这个问题。 – 2014-08-30 08:16:02

+0

为什么这是不坏的设计,我认为这是另一种选择。 – Mritunjay 2014-08-30 08:17:50

+0

这是一个替代方案,没关系,但是你没有回答我的版本是否被认为是不好的风格。 – 2014-08-30 08:19:02

5

技术上变量是“悬挂”,代码将执行这样的:代码执行之前在此范围内

var para1 = 'some value'; 
var para2; 
if(someCondition) 
    para2 = 'some other value'; 

一个范围内的所有声明var声明变量。因此,它在实践中没有太大的区别。不过,我认为这是一种很好的风格,可以像上面那样明确地编写代码,以便明确该范围中存在哪些变量。在条件内“隐藏”变量声明可能会导致混淆。

2

JavaScript的 '吊装' 的一个例子:

var para2 = "my value"; 

var factory = function(someCondition) { 
    var para1 = 'some value'; 
    console.log(para2); 
    if(someCondition) 
     var para2 = 'some other value'; 

    return new MyClass(para1, para2); 
} 

factory(true); // undefined 

上面的代码将日志 '未定义'。

+0

我在这里没有看到任何问题。它会记录完全相同,如果你在调用'log'之前你已经声明'var para2;'。 – 2014-08-30 08:31:39

+0

@DanielHilgarth有些人可能会想,并会感到困惑,因为它没有定义变量,所以会显示“我的价值”(全局)。但是,在JavaScript中所有的变量都是在函数启动时定义的。 – Yogesh 2014-08-30 08:36:38

1

JavaScript使用功能范围,因此,我会写这样

var factory = function(someCondition) { 
    var para1 = 'some value'; 
    var para2 = 'some other value'; 
    if(someCondition) 
    { 
     // some code.. 
    } 

    return new MyClass(para1, para2); 
} 
0

我会说这是所有权利。

var factory = function(someCondition) { 
    var para1 = 'some value'; 
    if(someCondition){ 
     var para2 = 'some other value'; 
     alert(para2); 
    } 

    alert(para2); 
    return new MyClass(para1, para2); 
} 

我已添加警报以便您可以关注。这里。在if语句中,您声明了一个名为para2的变量。当这段代码运行时,直接在它下面的alert函数显示'其他值'!这就说得通了。可能更不明智的是if语句之外的第二个提示还显示“其他值”!

这是怎么回事。你的para2变量在被称为块的内部被声明。块是出现在打开和关闭括号内的任何内容 - {和}。在许多编程语言中,块内声明的变量是该块本身范围的一部分。这意味着这些变量是本地的,不能在块之外访问。

JavaScript不像那些许多“其他”编程语言。 JavaScript不支持块范围。

查看更多here

+0

感谢您的回答。你可能会注意到我在我的问题中正确地链接了一个解释。换句话说,我知道这一点。 – 2014-08-30 09:12:39