在if中声明变量并在外部使用

时间:2014-08-30 08:13:31

标签: javascript

请考虑以下代码:

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风格指南视为不好的风格?如果是这样,提议的替代方案是什么?

请注意:我知道提升以及变量不是块范围而是功能范围的事实。

5 个答案:

答案 0 :(得分:5)

从技术上讲,变量是"悬挂" ,代码将按如下方式执行:

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

范围内的所有var声明在执行代码之前声明此范围内的变量。因此,它在实践中并没有太大的不同。但是,我认为如上所述明确编写代码是很好的方式,以明确范围内存在哪些变量。 "隐藏"条件内的变量声明会导致混淆。

答案 1 :(得分:3)

这不应该是一种糟糕的风格,这可能有点令人困惑。

任何方式javascript都会因为吊装而像贝娄那样,所以写得更好也像贝娄一样。

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版本引入了一个新关键字,它提供了变量阻止作用域。

答案 2 :(得分: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

以上代码将记录'undefined'。

答案 3 :(得分:1)

JavaScript使用函数范围,因此我会像这样写

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

    return new MyClass(para1, para2);
}

答案 4 :(得分: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的变量。运行此代码时,它下方的警报功能会显示“其他一些值”!那讲得通。可能不太有意义的是,if语句之外的第二个警报也会显示“其他一些值”!。

以下是正在发生的事情。如果称为块,则在para2变量内部声明。块是打开和关闭括号内的任何内容 - {和}。在许多编程语言中,块内声明的变量是该块自身范围的一部分。这意味着这些变量是本地的,不能在块之外访问。

JavaScript与许多“其他”编程语言不同。 JavaScript不支持块范围。

查看更多here