美文网首页
变量提升的问题hoisting

变量提升的问题hoisting

作者: GeekNiuniu | 来源:发表于2016-04-23 13:02 被阅读0次

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

    变量提升的问题hoisting 1.先看一段代码 var a="you bad bad"; alert(v); 可...

  • 浏览器中的JavaScript执行机制

    变量提升:JavaScript代码是按顺序执行的吗? 变量提升(Hoisting)所谓的变量提升,是指在 Java...

  • 变量提升(hoisting)

    JavaScript的工作方式是,先解析代码,获取所有被声明的变量,然后再一行一行地运行。这造成的结果,就是所有的...

  • 变量提升(hoisting)

    变量提升(hoisting) 变量提升,提升的是声明而不是赋值所有的变量的声明语句,都会被提升到代码的头部,这就叫...

  • 理解 JS 作用域链与执行上下文

    贫道,感觉,JS的坑,不是一般地大。 变量提升: 变量提升( hoisting )。 我可恨的 var 关键字: ...

  • [深入理解ES6]块级绑定

    var声明与变量提升 变量提升(hoisting):使用var关键字声明的变量,无论声明位置在何处,都会被视为声明...

  • js变量提升Hoisting

    最终结果为undefined这里有私有作用域的语法,加上变量提升,这段代码相当于: 额外内容提示:函数声明有函数声...

  • js 变量提升(hoisting)

    先了解一下变量的生命周期 变量在它声明时初始化。 局部变量在函数调用时创建,当函数执行完毕后销毁,这和为什么要使用...

  • Javascript 变量提升(hoisting)

    什么是作用域(scoping) 在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用...

  • javascript 变量提升(Hoisting)

    简介 “变量提升”意味着变量和函数的声明会在物理层面移动到代码的最前面,但这么说并不准确。实际上变量和函数声明在代...

网友评论

      本文标题:变量提升的问题hoisting

      本文链接:https://www.haomeiwen.com/subject/sggxrttx.html