一、变量提升
在ES6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域。
1.所指的形式:必须有关键字var
。
2.提升的方式:将变量声明提升到它所在作用域的顶部。
3.示例代码:
console.log(v1); //undefined
var v1= 'v1 is good';
console.log(v1); //v1 is good
function fn () {
console.log(a1); // undefined
var a1= 'a1 is not good';
console.log(a1); // v1 is good
}
fn();
之所以会是以上的打印结果,是由于js的变量提升,实际上上面的代码是按照以下来执行的:
var v1; //变量提升,全局作用域范围内,此时只是声明,并没有赋值
console.log(v1); //undefined
v1= 'v1 is good'; // 此时赋值
console.log(v1); //v1 is good
function fn () {
var a1; // 变量提升,函数作用域范围内
console.log(a1); // undefined
a1= 'a1 is not good';
console.log(a1); // a1 is good
}
fn();
不用关键字,let 和const定义变量,提前使用,会报ReferenceError的错误。
二、函数提升
s中创建函数常见的两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提升!
console.log(f1); // function f1() {}
console.log(f2); // undefined
function f1() {}
var f2 = function() {}
函数的提升过程
function f1() {} // 函数提升,整个函数声明代码块提升到当前作用域的顶部
console.log(f1);
console.log(f2);
var f2 = function() {}
网友评论