由于第二个声明将覆盖第一个声明,因此下面的代码将产生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
最终,我将使用let
或const
(以防止多次声明相同的变量)来声明变量而不是var
但我正在尝试理解结果的原因在例2和3中产生的是如此不可预测的。谢谢。
答案 0 :(得分:3)
示例1 等同于以下代码。此处bar
在return
之前被覆盖,因此会使用分配给它的最后一个值进行评估。有关您的更多信息,请阅读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
(有一个函数表达式)相同