Javascript 无功提升
为什么在第一种情况下会打印x是一个函数而不是未定义的Javascript 无功提升,javascript,function,var,hoisting,Javascript,Function,Var,Hoisting,为什么在第一种情况下会打印x是一个函数而不是未定义的 (() => { var x function x() {} console.log(x) })() > ƒ x() {} (() => { var x = 1 function x() {} console.log(x) })() > 1 这是因为JavaScript是如何处理提升的。带有VARIABLENAME{}函数的函数在变量的存在性调用下被调高,
(() => {
var x
function x() {}
console.log(x)
})()
> ƒ x() {}
(() => {
var x = 1
function x() {}
console.log(x)
})()
> 1
这是因为JavaScript是如何处理提升的。带有VARIABLENAME{}函数的函数在变量的存在性调用下被调高,变量的变化值保持不变,但由于函数向上移动,因此相对向下移动 第一盘 => { 变量x 函数x{} console.logx
} 这是因为JavaScript是如何处理提升的。带有VARIABLENAME{}函数的函数在变量的存在性调用下被调高,变量的变化值保持不变,但由于函数向上移动,因此相对向下移动 第一盘 => { 变量x 函数x{} console.logx
} 提升是在编译期间将变量仅移动到声明或函数声明的左侧到相应环境的顶部的行为 Javascript引擎在代码执行之前的创建阶段为变量和函数分配内存 您的第一个示例的解释与您编写的一样:
// creation phase start
var x = undefined;
function x() {}
// creation phase end
// execution phase start
x = 1;
console.log(x); // therefore x got overwritten, therefore 1
// execution phase end
//创建阶段开始
var x=未定义;
函数x{};//功能完全提升。所以x引用了这个函数。
//创建阶段结束
//执行阶段开始
console.logx;//因此x是一个函数
//执行阶段结束
第二个示例的解释与您编写的有点不同:
// creation phase start
var x = undefined;
function x() {}
// creation phase end
// execution phase start
x = 1;
console.log(x); // therefore x got overwritten, therefore 1
// execution phase end
还有一件有趣的事情要知道:
如果你像这样写你的第一个例子
变量x
函数x{}//圆括号
console.logx
。。。函数声明的提升不会发生,因为引擎看到的第一件事既不是var,也不是函数 提升是在编译期间将变量仅移动到声明或函数声明的左侧,然后移动到相应环境的顶部的行为 Javascript引擎在代码执行之前的创建阶段为变量和函数分配内存 您的第一个示例的解释与您编写的一样:
// creation phase start
var x = undefined;
function x() {}
// creation phase end
// execution phase start
x = 1;
console.log(x); // therefore x got overwritten, therefore 1
// execution phase end
//创建阶段开始
var x=未定义;
函数x{};//功能完全提升。所以x引用了这个函数。
//创建阶段结束
//执行阶段开始
console.logx;//因此x是一个函数
//执行阶段结束
第二个示例的解释与您编写的有点不同:
// creation phase start
var x = undefined;
function x() {}
// creation phase end
// execution phase start
x = 1;
console.log(x); // therefore x got overwritten, therefore 1
// execution phase end
还有一件有趣的事情要知道:
如果你像这样写你的第一个例子
变量x
函数x{}//圆括号
console.logx
。。。函数声明的提升不会发生,因为引擎看到的第一件事既不是var,也不是函数 你可能想看,因为这是一个相关的答案,但不是一个重复的问题,你可能想看,因为这是一个相关的答案,但不是一个重复的问题