想总结一下JS的变量提升特性,都是由于一道题。先上题。

  1. var name = 'World!';
  2. (function () {
  3. if (typeof name === 'undefined') {
  4. var name = 'Jack';
  5. console.log('Goodbye ' + name);
  6. }else{
  7. console.log('Hello ' + name);
  8. }
  9. })();

这是JavaScript专业八级測试。你能做对几道?上的一道题。

假设不知道JS的变量提升的话。绝对会以为world的name是全局变量,能够訪问到name,然后运行else里的语句。要是这么觉得就大错特错了。

function能够訪问到name=World!这个全局变量这没错。可是function内部又定义了一个局部变量name,并且是用var定义,这样就截然不同了。那我们来做个实验。

是否在函数内部定义Jack。对整个程序发生了质的变化。

那么我们以下就来分析一下为什么会有这种变化。

变量定义是存在作用域的,这里就不做累述。详细的能够到Javascript的变量和作用域问题(二)之作用域里查看。

我们最基本的是了解下变量声明之后是怎么被解释器解释的,

  1. function foo() {
  2. //something
  3. var x = 1;
  4. }

这个样例实际上和以下的样例是同样的。

  1. function foo() {
  2. var x;
  3. //something
  4. x = 1;
  5. }

也就是说。变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部。

要是这样讲没有说服力的话。再来用console.log试一下就好。

  1. function foo() {
  2. console.log(x); //undefined
  3. var x = 1;
  4. }
  5. foo();

非常明显,在var之前是訪问不到x的。由于var仅仅是定义了x,在console的时候并没有赋值,所以当然是undefined了。

再回到最原先的题上,由于在匿名函数里又又一次定义了一遍name。所以name的var被悄悄的提到了函数的最前面。

也变成了这样。

  1. var name = 'World!';
  2. (function () {
  3. var name; //变量提升了。
  4.  
  5. if (typeof name === 'undefined') {
  6. name = 'Jack';
  7. console.log('Goodbye ' + name);
  8. }else{
  9. console.log('Hello ' + name);
  10. }
  11. })();

name就变成了undefined,当然进入了if而不是进入else,自然而然也就打印出了Goodbye,Jack。

一点补充。假设对于全局作用于范围的变量,var与不var是有差别的.

没有var的写法。其变量不会被提升。

比方以下两个程序。第二个会报错:

  1. alert(a);
  2. var a=1;
  3.  
  4. alert(a);
  5. a=1;

总之。变量提示就是var在函数内部使用的时候,在var定义变量的语句之前是訪问不到变量的!

JavaScript的那些坑之变量提升的更多相关文章

  1. 关于JavaScript的词法作用域及变量提升的个人理解

    关于JavaScript的作用域,最近听到一个名词:“词法作用域”:以前没有听说过(读书少),记录一下对此的理解,加深印象. 词法作用域:在JavaScript中,一个函数的作用域,在这个函数定义好的 ...

  2. js 面试的坑:变量提升

    全局中的解析和执行过程 预处理:创建一个词法环境(LexicalEnvironment,在后面简写为LE),扫描JS中的用声明的方式声明的函数,用var定义的变量并将它们加到预处理阶段的词法环境中去. ...

  3. javascript中的作用域和变量提升

    js的运行主要分两个阶段:js的预解析和运行,预解析阶段所有的变量声明和函数定义都会提前,但是变量的赋值不会提前.

  4. 《浏览器工作原理与实践》<07>变量提升:JavaScript代码是按顺序执行的吗?

    讲解完宏观视角下的浏览器后,从这篇文章开始,我们就进入下一个新的模块了,这里我会对 JavaScript 执行原理做深入介绍. 今天在该模块的第一篇文章,我们主要讲解执行上下文相关的内容.那为什么先讲 ...

  5. js中变量提升和函数提升

    变量提升和函数提升的总结 我们在学习JavaScript时,会遇到变量提升和函数提升的问题,为了理清这个问题,现做总结如下,希望对初学者能有所帮助 我们都知道 var 声明的变量有变量提升,而 let ...

  6. javascript中变量提升的理解

    网上找了两个经典的例子 var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); // 10 var ...

  7. javascript中的变量作用域以及变量提升

    在javascript中, 理解变量的作用域以及变量提升是非常有必要的.这个看起来是否很简单,但其实并不是你想的那样,还要一些重要的细节你需要理解. 变量作用域 “一个变量的作用域表示这个变量存在的上 ...

  8. JavaScript系列文章:变量提升和函数提升

    第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...

  9. 关于JS变量提升的一些坑

    function log(str) { // 本篇文章所有的打印都将调用此方法 console.log(str); } 函数声明和变量声明总是会被解释器悄悄地被“提升”到方法体的最顶部 变量声明.命名 ...

随机推荐

  1. 【SCOI 2005】 骑士精神

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1085 [算法] IDA* [代码] #include<bits/stdc++. ...

  2. 2014/09/20 关于ArrayList的几种操作

    1.删除ArrayList集合元素 删除ArrayList集合里面的元素时,提供了Clear方法,Remove方法,RmoveAt方法和RemoveRange方法. Clear方法是移除所有的元素 R ...

  3. 从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化

    从有约束条件下的凸优化角度思考神经网络训练过程中的L2正则化 神经网络在训练过程中,为应对过拟合问题,可以采用正则化方法(regularization),一种常用的正则化方法是L2正则化. 神经网络中 ...

  4. Windows下Python + AutoCAD 多义线绘图小结

    简介 在windows下台下, 使用comtypes库, 通过ActiveX操作autocad, 从而读取AutoCAD数据 comtypes.client AutoCAD ActiveX GetAc ...

  5. 解决生成主键 id重复的解决办法

    作者:董春秋链接:https://www.zhihu.com/question/30674667/answer/49082988来源:知乎著作权归作者所有,转载请联系作者获得授权. 全局id生成器.我 ...

  6. centos6.6--------反向DNS配置

    一.反向区: 将域名解析为IP====================================================================================注 ...

  7. linux install PyMsql

    # 安装pip curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py python get-pip.py # 安装PyMysql pip in ...

  8. 4) 十分钟学会android--建立第一个APP,启动另一个Activity

    在完成上一课(建立简单的用户界面)后,我们已经拥有了显示一个activity(一个界面)的app(应用),该activity包含了一个文本字段和一个按钮.在这节课中,我们将添加一些新的代码到MyAct ...

  9. Django学习笔记----settings and database_based App demo

    原文参考docs.djangoproject.com, what can manage.py utility do? find here. 1.Database Setup 编辑settings.py ...

  10. spring boot的项目结构问题

    问题:spring boot项目能够正常启动,但是在浏览器访问的时候会遇到404的错误,Whitelable Error Page 404 分析及解决方案:首先Application文件要放在项目的外 ...