变量提高即将变量声明提高到它所在做用域的最开始的部分,即函数声明和变量声明老是被JavaScript解释器隐式地提高(hoist)到包含他们的做用域的最顶端。在ES6以前,JavaScript没有块级做用域(一对花括号{}即为一个块级做用域),只有全局做用域和函数做用域。前端
var name = 'Clam'; (function (){ console.log(name); })(); // Clam
上面的代码很简单。闲先声明一个变量名为name
的变量,同时赋值为Clam
。后面是一个当即执行函数,在函数体中控制台输出name
。结果为Clam
,没毛病~接着看下面的代码。函数
var name = 'Clam'; (function (){ console.log(name); var name = 'Klay'; })()
首先咱们本身分析一下上面的代码哈:首先声明了一个变量name
而且赋值为Clam
,紧接着也是一个当即执行函数,在函数体中首先控制台输出了name
,可是以后,又声明了赋值了一次变量name
。
那我来猜测一下,恩,控制台输出了Clam
,可是在当即执行函数结束以后,变量name
的值被修改为了Klay
。
可是,上面的代码运行的结果是:code
undifined // exm??
这就是我今天关注的东西:变量提高。ip
前面说过,变量提高会将变量的声明提高到其做用域的最前端。这里,name
所在的做用域就是指这个函数做用域,上面的代码就至关于如下代码。作用域
var name = 'Clam'; (function (){ var name; console.log(name); //undefined name = 'Klay'; })()
js中建立函数有两种方式:函数声明式和函数字面量式。只有函数声明才存在函数提高。io
console.log(f1); // function f1() {} console.log(f2); // undefined function f1() {} var f2 = function() {}
以上,enjoyconsole