【发布时间】:2019-05-22 19:07:27
【问题描述】:
当涉及到提升和变量突变时,我正在尝试解决一些问题。
- 变量赋值优先于函数声明
- 函数声明优先于变量声明
根据https://scotch.io/tutorials/understanding-hoisting-in-javascript,函数声明被提升到变量声明之上,而不是变量赋值之上。这非常令人困惑,因为我认为只有变量声明和函数声明会被提升。
var double = 22;
function double(num) {
return (num*2);
}
console.log(typeof double); // Output: number
所以提升它应该看起来像
function double(num) {
return (num*2);
}
var double;
double = 22;
console.log(typeof double); // Output: number
如果变量赋值优先于函数声明,为什么 double = 22 不在函数声明之上?另一个例子
var double;
function double(num) {
return (num*2);
}
console.log(typeof double); // Output: function
通过将函数提升到变量声明上方,控制台应该记录 undefined 不是吗?使用变量变异,最后的赋值是程序应该执行的。
【问题讨论】:
-
变量名称声明被提升,但变量assignment(带有
=)永远不会被提升 -
那么“变量赋值优先于函数声明”是什么意思呢?
-
@larryburns 这根本没有意义,真的。赋值和声明是两个完全不相关的东西,它们不会“优先于”彼此。我想这应该意味着您始终可以分配一个可变变量,并且之后它将保存分配的值,而不管该变量的声明位置/方式(使用
var或function)。 -
谁能解释在我的上一个示例中,即使函数被提升到变量声明之上,输出仍然是函数而不是未定义?
-
@larryburns 因为“优先”不是指顺序,如“被提升到另一个之上”。对于我们的目的,声明实际上没有任何顺序,所有变量都是一次创建的(那就是“提升”的实际含义)。优先级是指初始化变量的值,
undefined用于vars,函数对象用于functions。该规则意味着当有一个与var声明同名的function声明时,该变量被初始化为一个函数。
标签: javascript