以下两个代码在吊装方面有何区别。
function hoist1() {
console.log("Hello1 ",message);
message='Hoisting is all the rage!'
}
hoist1();
function hoist2() {
console.log("World ",message);
var message='Hoisting is all the rage!'
}
hoist2();
答案 0 :(得分:1)
案例1:
function hoist() {
console.log(message);//undefined
var message='Hoisting is all the rage!'
}
hoist();
等于:
function hoist() {
var message;//undefined
console.log(message);
message='Hoisting is all the rage!'
}
hoist();
所以,你没有定义;
在代码执行
之前,var hoisting发生情况2:
function hoist() {
console.log(message);//error,because message is not defined.
message='Hoisting is all the rage!'
}
hoist();
如果您删除控制台,执行代码后,它就像
var message;
function hoist() {
//console.log(message);
message='Hoisting is all the rage!'
}
hoist();
console.log(message);//Hoisting is all the rage!
因此,您可以访问message
中的hoist
。
message
此处未经声明分配将是全局变量。
当代码运行并且在没有声明的情况下遇到分配时,它会发生。
答案 1 :(得分:0)
此问题包含提升和范围。
提升意味着函数和变量在当前范围的顶部定义,在第1行为您的函数定义。
如果在没有var
关键字的情况下定义变量,JavaScript会查看当前和父作用域(在函数外部)以查看它是否已定义。如果使用严格模式,它会在发现它未定义后失败。如果不是严格模式,则将其定义为全局变量。使用严格模式!这通常是一种不受欢迎的行为。
答案 2 :(得分:0)
结果应为:
undefined
undefined
提升会将声明移到顶部,因此第二个函数将成为执行的函数,或hoist
。但是var
不允许提升值,只允许提升变量,例如var x = 5
将声明x在顶部但在之后设置X.因此,对邮件的评估为undefined
。
答案 3 :(得分:-1)
在第一个例子中:
message='Hoisting is all the rage!'
将修改(或创建,如果它不存在)全局message
对象的window
属性。
在第二个示例中,您只是设置一个未使用的本地。