变量提升的问题hoisting
1.先看一段代码
var a="you bad bad";
alert(v);
可以预见的结果是输出you bad bad
2.修改一下
var a="you bad bad";
(function(){
alert(a);})()
弹出的结果是一样的
3.但是接下来
var a="you bad bad";
(function(){
alert(a);
var a=" I love you";
})()
这个会弹出什么呢?
这里抛出了一个undefined。这里面就是一个变量提升的问题。
变量提升顾名思义就是把下面的变量或函数提到程序上面去定义,为了解释提升,我们先看一下js的作用域问题(scoping)。
1.在我们熟悉的C语言中
inta =1;
printf("%d, ", b);// 1
if(true) {
inta =2;
printf("%d, ", a);// 2
}
printf("%d\n", a;// 1
输出的结果将是1,2,1,这是因为在c语言中有块级作用域的概念,在if块中声明的变量,不会影响到外部作用域。
2.JavaScript中就不是上面的情况了
var a=1;
console.log(a);//1
if(true)
{
var a=2;
console.log(a);//2
}
console.log(a);//2
在这里输出结果是1,2,2.这是尹js中是函数级作用域。只有函数才会创建出新的作用域。
为了解决上面的问题,我么可以这样写
functionfoo(){
vara=1;
if(true){
(function(){
vara=2;
}());
}
console.log(a);//1
}
这样就是可以创建一个域不影响其他变量。
3.变量提升的时候只是提升变量的声明,并不会把赋值也提升。
看这个例子
(function(){
vara='apple;
varb='pear';
varc='banana';)
实际上,它的过程是
(function(){
vara,b,c;
a='apple';
b='pear';
c='banana';
})()
所以我们最开始那段报出undefined的代码应该是这样的
vara="you bad bad";
(function(){
vara;
alert(a);
vara=" I love you";
})()
从这里我们可以知道,我们主要把变量放在块级作用域的顶端,即var a;防止出现不希望看见的结果。
4.刚刚说不仅变量可以提升,函数也可以提升。我们知道在js中,函数有两种写法,一中是函数表达式,一种是函数声明方式,而只有函数声明方式才能被提升。
函数表达式失败提升:
functionMy(){
foo();
varfoo=functionfoo(){
alert("you bad bad");
}
}
My();
函数声明提升成功:
functionMy(){
foo();
functionfoo(){
alert("you bad bad");
}
}
My();
网友评论