变量提升的问题hoisting

变量提升的问题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();

你可能感兴趣的:(变量提升的问题hoisting)