1、变量声明提前:
看代码
(function(){ function add(){ alert(a); }})()/* 以上代码报错:ReferenceError: a is not defined, * 这很好理解 根本就没声明当然报错啦,往下看: */(function(){ function add(){ alert(a); // output:undefined; var a = "bcd"; alert(a); // output:bcd; }})()//以上代码对于解释器来说是下面这样的,所以没有报错,且输出了undefined;(function(){ function add(){ var a; // eq: var a = undefined; alert(a); // output:undefined; a = "bcd"; alert(a); // output:bcd; }})()//再来看一中情况:(function(){ var a = "wer"; function add(){ alert(a); // output:undefined; var a = "bcd"; alert(a); // output:bcd; }})()/* *原因如下:对于解释器来代码是这样的 */(function(){ var a = "wer"; function add(){ var a; // eq:var a = undefined; alert(a); // 向上首先找到局部变量a, a = "bcd"; alert(a); }})()2、函数提前:
(function(){ alert(add(1, 3)); // output:4, function add(x, y){ return x + y; }})// 以上代码中函数add 不只是声明提前了而是整个add函数的定义都被提前了//另一种情况:(function(){ alert(add(1, 3)); //TypeError: add is not a function var add = function(x, y){ return x + y; }})()//对于编译器来说代码如下:(function(){ var add; alert(add(1, 3)); //所以TypeError add = function(x, y){ return x + y; }})() 总结: 1、变量的声明被提前到作用域顶部,赋值保留在原地2、函数声明整个“被提前”3、函数作为值赋给变量时只有变量“被提前”了,函数没有“被提前”关键字:JavaScript