js 变量、函数声明提前问题

1、变量声明提前:看代码(function(){ function add(){ alert(a); }})()/* 以上代码报错:ReferenceError: a is not defined, * 这很好理解 根本就没声明当然报错啦,往下看: */(function(){ function add(){ alert(a);

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