例子
console.log(a)
var a = 1
var a = function() {
console.log(2)
}
function a() {
console.log(3)
}
// 浏览器输出:function a() { console.log(3) }
解析
- 变量提升和函数提升:就是将声明的变量或者函数,提升至所在作用域的顶部
- 函数声明优先级高于变量声明
- js 声明函数的方式有3种
- 变量是先声明,再赋值
console.log(a)
// 变量声明
var a = 1
// 函数表达式
var a = function() {
console.log(2)
}
// 函数声明
function a() {
console.log(3)
}
// 上述代码实际执行过程
// 1.函数声明的提升优先级高于变量声明
function a() {
console.log(3)
}
console.log(a)
// 2.变量先声明,再赋值
var a
a = 1
a = function() {console.log(2)}
更多练习
js 声明函数的3种方式
函数表达式:将函数定义为表达式语句(通常是先进行变量声明,再执行赋值语句)。
- 函数表达式是可以命名的,也可以是匿名的。匿名则被认为是匿名函数,即使是命名的,函数名也只能在自身函数作用域中使用
- 函数表达式可以存储在变量或对象属性中
var a = function fn() {
console.log('带函数名的函数表达式');
console.log(fn);
}
a()
// 带函数名的函数表达式
// [Function: fn]
fn()
// ReferenceError: fn is not defined
// 因为函数表达式的函数名,只能在自身函数作用域中使用
函数声明:定义时必须以function开头,是一种独立的结构,会声明一个具名函数。
- 函数声明一定会进行函数提升,使其能在它所在作用域的任意位置被调用
- 该函数可以通过函数名赋值给变量和对象属性
Function构造器:使用Function构造器创建函数,不推荐
//Function()构造器
var f =new Function()
// 函数表达式
var f = function() {
console.log(1);
}
// 函数声明
function f (){
console.log(2);
}
console.log(f()) //1
// function() {console.log(1)} 这条函数表达式是最后执行的,所以最后输出的是1