声明两次相同的变量。哪一个用过? - JAVASCRIPT

时间:2017-12-21 09:58:59

标签: javascript scope hoisting

由于第二个声明将覆盖第一个声明,因此下面的代码将产生8。对!完全有道理。

示例1

function foo(){
    function bar() {
        return 3;
    }
    return bar();
    function bar() {
        return 8;
    }
}
console.log(foo()); // ---> 8

以下代码生成3,这意味着它是第一个被调用的表达式。

示例2

function foo(){
    var bar = function() {
        return 3;
    };
    return bar();
    var bar = function() {
        return 8;
    };
}
console.log(foo()); // ---> 3

我倾向于得出结论,在JavaScript中,只使用了第一个声明的变量,如上所示。但是,下面的代码会生成7(嗯......抓我的头)

示例3

var a = 4;
var a = 7;
console.log(a); //---> 7

最终,我将使用letconst(以防止多次声明相同的变量)来声明变量而不是var但我正在尝试理解结果的原因在例2和3中产生的是如此不可预测的。谢谢。

2 个答案:

答案 0 :(得分:3)

示例1 等同于以下代码。此处barreturn之前被覆盖,因此会使用分配给它的最后一个值进行评估。有关您的更多信息,请阅读Variable and Function Hoisting

function foo(){
    function bar() {
        return 3;
    }
    
    function bar() {
        return 8;
    }
    
    return bar(); 
}
console.log(foo()); 

示例2 等同于以下代码。在这里,您可以看到bar仅被声明一次,并且第一个值被分配给它。第二个赋值在返回后完成,因此代码无法到达它。并且return将在第一次分配时执行。

function foo(){
    var bar;
    bar = function() {
        return 3;
    };
    
    return bar();
    
    bar = function() {
        return 8;
    };
}
console.log(foo());

示例3 怎么样,当你用var多次声明同一个变量时,后面的var只会被忽略。所以喜欢这个

var a = 4;
a = 7;
console.log(a);

答案 1 :(得分:1)

不,你宣布这些功能的方式就不同了。

这正是yourRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() { @Override public void onSuccess(DocumentSnapshot documentSnapshot) { //get data mCardFeedList.setAdapter(mAdapter); } }); var functionName = function() {}

之间的区别

考虑你有两个功能。

function functionName() {}

区别在于var function1 = function() { }; function function2() { } 是一个函数表达式,因此仅在达到该行时定义。

function1

当编译器到达此行时,将抛出function1(); var function1 = function() { }; 未定义的错误。

function1是一个功能声明,它是全球性的(由于提升)。

function2

此代码将调用function2(); function function2() { } 函数。

所以,在你的第一个例子中,它与function2相同(有一个函数声明)。

在你的第二个例子中,它与function2(有一个函数表达式)相同