变量提升的主要原因是 JavaScript 的解释执行方式。在代码执行之前,JavaScript 引擎会扫描整个作用域,找到所有的变量声明(使用 var
关键字声明的变量)和函数声明,然后将它们提升到作用域的顶部。
例如,考虑以下代码:
javascript:console.log(name); // 输出 undefined
var name = 'John';
在这个代码中,虽然 console.log
出现在 name
的声明之前,但由于变量提升的存在,它不会引发运行时错误。相当于 JavaScript 引擎将代码解释为:
var name; console.log(name); // 输出 undefined
name = 'John';
这就是为什么会称之为 "变量提升",因为变量和函数声明会在实际代码执行之前被提升到作用域的顶部。
需要注意的是,变量提升只适用于使用 var
关键字声明的变量和函数,不适用于使用 let
和 const
声明的变量,因为 let
和 const
有块级作用域,并且不会被提升到块级作用域的顶部。因此,在使用 let
和 const
声明的变量之前引用它们会引发 ReferenceError
。这是 JavaScript 中一个更加严格的行为,有助于减少一些潜在的错误。
console.log(fun) // function fun() {}
function fun() {}
if (false) {
function fun2(){}
}
console.log(fun2) // undefined 不会报错
console.log(fun)
:在这一行中,函数 fun
的声明在 console.log
之前。由于函数声明的变量提升,fun
变量在 console.log
之前已经被创建,并且其值是函数 fun
本身,所以不会报错,输出的结果是 function fun() {}
。
function fun() {}
:这是函数 fun
的声明,它在全局作用域中声明了一个函数。
if (false) { function fun2(){} }
:虽然这里有一个 if
语句,但是由于条件始终为 false
,因此 if
语句内的函数 fun2
不会被声明或创建。这个函数声明在条件内部,不会影响外部作用域。
console.log(fun2)
:在这一行中,尝试输出函数 fun2
,但由于它在当前作用域中并未声明或创建(因为条件始终为 false
,函数声明不会被执行),所以输出的结果是 undefined
,并且不会报错。
总结:函数声明会被提升到其所在作用域的顶部,因此在声明之前引用函数是有效的,但在条件内部的函数声明只会在条件成立时执行,否则不会对外部作用域产生影响。
标签:log,console,函数,作用域,提升,fun,声明,变量 From: https://www.cnblogs.com/Ly021/p/17755849.html