变量提升 只是提升变量的声明,并不会把赋值也提升上来,函数提升是把整个函数都提到前面去。只有函数才会创建新的作用域(函数声明才会被提升,表达式声明不会被提升)
var v=‘Hello World‘;
alert(v); //Hello World
var v=‘Hello World‘;
(function(){
alert(v); //hello world
})()
var v=‘Hello World‘;
(function(){
alert(v); //undefined
var v=‘I love you‘;
})()
等同
var v=‘Hello World‘;
(function(){
var v; //变量提升
alert(v); //undefined
v=‘I love you‘;
})()
//当解析器读到 if 语句的时候,它发现此处有一个变量声明和赋值,于是解析器会将其声明提升至当前作用域的顶部(这是默认行为,并且无法更改),这个行为就叫做 Hoisting。
var a = 1;
function foo() {
if (!a) {
var a = 2;
}
alert(a);
};
foo();
var a = 1;
function foo() {
var a;
if (!a) {
a = 2;
}
alert(a);
};
foo();
(function(){
var a=‘One‘;
var b=‘Two‘;
var c=‘Three‘;
})()
(function(){
var a,b,c;
a=‘One‘;
b=‘Two‘;
c=‘Three‘;
})()
2.2 函数提升
函数提升是把整个函数都提到前面去。
在我们写js code 的时候,我们有2中写法,一种是函数表达式,另外一种是函数声明方式。我们需要重点注意的是,只有函数声明形式才能被提升。
函数声明方式提升【成功】
复制代码 代码如下:
function myTest(){
foo();
function foo(){
alert("我来自 foo");
}
}
myTest();
函数表达式方式提升【失败】
复制代码 代码如下:
function myTest(){
foo();
var foo =function foo(){
alert("我来自 foo");
}
}
myTest();