Javascript引擎的工作方式是:先解析代码,获取所有被声明的变量,然后再一行一行的运行。
一.变量提升
在Es6之前,JavaScript没有块级作用域,只有全局作用域和函数作用域,变量提升即将变量声明提升到它所在作用域的最开始的部分。
首先举一个简单的例子:
console.log(b);//undefined
var b =1;
console.log(b);//1
首先使用console.log方法在控制台显示变量b。这个时候变量B还没有声明和赋值,但不会报错,因为存在变量提升,先将变量B的声明提升到了最开始的地方;
var b;
console.log(b);//undefined
b =1;
console.log(b);//1
举例二:
var a = 5;
function foo(){
a = 2;
console.log(a);
var a;
}
foo();//2
在函数内解析编译时,“var a”因为变量提升被提前了,所以我们看到的是内部变量a,而不是外面已经赋值的外部变量5;
举例三:
var a=5;
function foo(){
console.log(a);
var a = 2;
}
foo();//undefined
二.函数提升
js创建函数存在两种方式:函数声明和函数表达式,只有函数声明存在函数提升;
//函数声明
function myTest(){
foo();
function foo(){
alert("我来自foo");
}
}
myTest();//我来自foo
//函数表达式
function myTest(){
foo();
var foo = function(){
alert("我来自foo");
}
}
myTest();//TypeError:foo is not a function;
总结:关于变量提升和函数提升的问题大概就这些,可以多做一些练习;
(function() {
console.log(a); //undefined
a = 'aaa';
var a = 'bbb';
console.log(a); //'bbb'
})();
console.log(f1()); //undefined
console.log(f2); //undefined
function f1() {console.log('aa')} //aa
var f2 = function() {}
网友评论