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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,740评论 18 399
  • ● 闭包基础 ● 闭包作用 ● 闭包经典例子 ● 闭包应用 ● 闭包缺点 ● 参考资料 1、闭包基础 作用域和作...
    lzyuan阅读 959评论 0 0
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,265评论 0 4
  • 《ijs》速成开发手册3.0 官方用户交流:iApp开发交流(1) 239547050iApp开发交流(2) 10...
    叶染柒丶阅读 5,281评论 0 7
  • ECMAScript关键字 delete do else finally function in instance...
    doudou2阅读 725评论 0 0