如果熟悉js代码执行的过程,这个问题不难理解
一、变量提升
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; // 先声明变量,没有赋值
function fun(){
var a; // 声明变量,没有赋值
console.log(a) // undefined,不报错
a = 'world'
console.log(a) // world
}
// 不声明定义变量
console.log(name) //报错,变量没有定义声明
// 变量提升
console.log(info) // undefined,不报错
info = "hello";
fun();
二、函数提升
创建函数有三种方式:
1.函数声明
2.函数表达式
3.使用Function对象创建(不推荐使用)
只有在“函数声明”方式中,函数才会提升。
函数提升:执行函数代码时,先执行函数声明;
// 只有函数声明形式才会函数提升
sayHello(); // 不会报错,正常执行
function sayHello(){
console.log("hello !")
}
fun(); // 报错(undefined is not a function) ,此时fun是个变量,虽然会变量提升,但在此行值为undefined;undefined不是函数,因此这句报错
var fun = function(){}
相当于如下:
function sayHello(){
console.log("hello !")
}
var fun;
sayHello(); // 不会报错,正常执行
fun(); // 此时fun值为undefined,报typeError
fun = function(){}
来源:http://www.cnblogs.com/RocketV2/p/6531819.html