一、变量提升
ES5中没有块作用域,只有全局作用域、函数作用域。
// 不声明定义变量 console.log(name) //报错,变量没有定义 // 变量提升 console.log(info) // undefined,不报错 var info = "hello"; function fun(){ console.log(a) // undefined,不报错 var a = ‘world‘
console.log(a) // world }
fun();
之所以出现这种情况,是因为变量提升导致的;上述过程相当于:
var info; // 先声明变量,没有赋值 // 不声明定义变量 console.log(name) //报错,变量没有定义声明 // 变量提升 console.log(info) // undefined,不报错 info = "hello"; function fun(){ var a; // 声明变量,没有赋值 console.log(a) // undefined,不报错 a = ‘world‘ console.log(a) // world } fun();
二、函数提升
创建函数有两种方式:函数声明、函数表达式;只有在“函数声明”方式中,函数才会提升。
函数提升:执行函数代码时,先执行函数声明;
// 只有函数声明形式才会函数提升 sayHello(); // 不会报错,正常执行 function sayHello(){ console.log("hello !") } fun(); // 报错(undefined is not a function) ,此时fun是个变量,虽然会变量提升,但在此行值为undefined;undefined不是函数,因此这句报错 var fun = function(){}