我正在自己学习javascript。今天我遇到了一个令人困惑的代码示例。
function fool(a, b){
if(b)
var c = "Mary"
alert(c);
}
fool(1, true); //Returns "Mary"
fool(1, false); //Returns undefined instead of error
另一方面,如果我这样做
function fool(a, b){
//if(b)
// var c = "Mary"
alert(c);
}
fool(1, true); //Firebug error: ReferenceError: c is not defined
fool(1, false);
第一次机会发生错误。怎么会这样?
答案 0 :(得分:2)
引用MDN
var hoisting
因为在执行任何代码之前处理变量声明(和一般声明),所以在代码中的任何地方声明变量等同于在顶部声明它。这也意味着变量可以在声明之前使用。此行为称为“提升”,因为看起来变量声明被移动到函数或全局代码的顶部。
示例:
bla = 2
var bla;
// ...
// is implicitly understood as:
var bla;
bla = 2;
针对您的具体情况:
// Your code
function fool(a, b){
if (b)
var c = "Mary"
alert(c);
}
// Equivalent code
function fool(a, b){
var c = undefined;
if (b)
c = "Mary";
alert(c);
}
作为旁注,Javascript不断发展。
引入了let
关键字,它的工作方式与您预期的一样,但尚未在所有浏览器中支持,因此您只能在控制javascript VM时使用它(例如使用NodeJS,nw.js ,. ..)
答案 1 :(得分:1)
JS引擎将重新排列您的第一个示例:
function fool(a, b){
// statement always executed, no matter what
var c;
if (b)
c = "Mary"
alert(c);
}
无论if语句是否被执行,var c
语句都会hoisted到函数体的顶部,因此在当前函数范围内声明。
答案 2 :(得分:0)
您已对变量' c'进行了评论。并试图显示它。它会给你一个错误,因为没有变量定义为' c'。
代码中有拼写错误。
试试这个
if(b){
alert(c);
}
答案 3 :(得分:0)
function fool(a, b){
if(b)
var c = "Mary"
alert(c);
}
fool(1, true); //Returns "Mary"
fool(1, false); //Returns undefined instead of error
让我们分解 -
您正在调用一个函数,它将b
作为false
传递到if
循环,并仅将第一行视为if
的一部分并继续执行下一行行alert(c)
。作为b='false'
,因此不会将Marry
分配给c
var。因此,现在您提醒c
undefined
if
,b
将不会处理它,直到它在函数参数中获得{{1}}为真。
答案 4 :(得分:0)
我在代码中注意到了两件事 1)如果范围:当你不使用括号({})时,它只会在If块下只有一个句子。因为如果条件是,那么解释员就不会知道。 所以你的代码是
if(b)
var c = "Mary"
alert(c);
应该像
if(b){
var c = "Mary"
alert(c);
}
如果你想要警告(c)只在if条件的情况下执行。
2)吊装:现在第二个问题是即使你的条件是假的而且句子没有执行它是如何警告未定义的原因是变量吊装,这是在任何代码执行之前执行的变量声明。所以,即使你做了类似
的代码var k="something";
它将首先声明k变量 喜欢
var k=undefined;
k="something";
因此,在您的代码中,首先声明了c,然后执行代码。
我希望它会有所帮助