变量提升
使用var 声明的变量会进行变量提升。变量提升的作用域是整个函数,也就是说,var声明的变量会被提升到所在作用域的最顶端。
// 变量提升
function f (){
console.log(y) // undefined
var y = 1;
}
f();
console.log(y); // 报错:y is not defined
// 变量提升
var i =5;
function f() {
console.log(i); // undefined
if (false) {
var i = 10;
}
}
f()
// 变量提升
var i =5;
function f() {
console.log(i); // 5
function fn() {
var i = 10;
}
}
f();
var i = 10 这句代码是在 fn 这个函数的执行环境里,变量声明提升只能到 fn 函数的开头。
函数提升
js中声明函数的三种方式:函数声明、函数表达式、构造函数。
函数声明: 这种方式就是使用 function 声明一个具名函数,特点是可以先使用后声明(函数提升
)。
// 函数声明
console.log(f()); // 3
function f() {
var m = 1, n = 2;
return m + n;
}
函数表达式:这种方式是把一个匿名函数赋给一个变量,必须先声明后使用。
// 函数表达式
console.log(one()); // 报错:one is not a function
var one = function () {
var m = 1, n = 2;
console.log(m + n);
}
遇到函数声明会将整个函数声明提升,而函数表达式只是提升一个函数名,里面的内容并没有提升。
当函数声明和函数表达式同时存在时,会优先提升函数声明。
console.log(one()); // 7
var one = function () {
var i = 2, j = 3;
return i + j;
}
function one() {
var i = 3, j = 4;
return i + j;
}