最近,在读《你不知道的JavaScript(上卷)》这本书,书中详细阐述了JavaScript众多重要但经常被大家忽略的点,在此强烈推荐!!!书中,第4章讲述了“提升”,从示例出发讲述了变量和函数提升的过程,纠正了自己以前错误的理解(相信好多人理解都是错误)!
我们习惯将var a = 2;看做一个声明,而实际上JavaScript引擎不这么认为!下面几个示例让你彻底搞懂JavaScript中的变量提升!
示例1:

a = 2;
var a ;
console.log(a); //2

示例2:

console.log(b); //undefined
var b = 2;

示例3:

var c;
console.log(c); //undefined
c = 2;

示例4:

foo();
function foo(){console.log(d);  //undefinedvar d = 2;
}

示例5:

bar();   //TypeError
var bar = function too(){// ....
}

示例6:

aoo();   //TypeError
boo();  //ReferenceError
var aoo = function boo(){// ...
}

示例7:

function foo(){console.log(1);
}
foo();  //1
foo = function(){console.log(2);
};

示例8:

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

示例9:

foo();   //b
var a = true;
if(a){function foo(){ console.log("a"); }
}else{function foo(){ console.log("b"); }
}

注意:这个行为并不可靠,在JavaScript未来的版本中有可能发生改变,因此应该尽可能避免在块内部声明函数。

总结:
1. var a = 2;其中var a在编译阶段,a=2在执行阶段;
2. 无论作用域中的声明(变量和函数)出现在什么地方,都将在代码本身执行前首先进行处理;
3. 声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升;
4. 函数会首先被提升,然后才是变量,重复的var(变量)声明会被忽略掉;
5. 后面的函数声明可以覆盖前面的。
PS:
1. RHS查询在所有嵌套的作用域中遍寻不到所需遍历会抛出ReferenceError。

2. RHS查询到一个变量,但你尝试对其不合理的操作(引用null或undefined类型中的属性),会抛出TypeError。

JavaScript提升(你不知道的JavaScript)相关推荐

  1. 你不知道的javascript(上卷)----读书笔记

    <!DOCTYPE html> <html><head><meta charset="utf-8"><title>你不知 ...

  2. 读书笔记-你不知道的JavaScript(上)

    本文首发在我的个人博客:http://muyunyun.cn/ <你不知道的JavaScript>系列丛书给出了很多颠覆以往对JavaScript认知的点, 读完上卷,受益匪浅,于是对其精 ...

  3. 十分钟快速了解《你不知道的 JavaScript》(上卷)

    最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...

  4. 你不知道的JavaScript 上卷 Part1

      这篇博客躺在我的草稿箱里有一阵子了,差点给遗忘了哈哈. 前言   最近开始喜欢读一些书,从书中找答案,在阅读中查漏补缺.   记得小学初中时候最爱看书了,如今却不知怎的,习惯性从网络中摄取知识,搜 ...

  5. 你不知道的javascript上卷

    你不知道的javascript上卷 作用域 javascript是一门编译语言,它不是提前编译的,编译结果也不能在分布式系统中移植.编译的步骤一般如下: 分词/词法分析 词法分析是有状态的判断一个分词 ...

  6. 精读《你不知道的 javascript(上卷)》

    前言 <你不知道的 javascript>是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途.本书介绍了该 ...

  7. 《你不知道的JavaScript上卷》知识点整理与读书笔记

    各位路过的的大佬.求关注.求点赞.谢谢 第一部分 作用域和闭包 第1章 作用域是什么 1.1编译原理 1.2理解作用域 1.3作用域嵌套 1.5异常 第2章 词法作用域 2.1词法阶段 2.2欺骗词法 ...

  8. 你不知道的JavaScript 上卷读书笔记

    看了<你不知道的JavaScript 上>,为了防止自己忘记,特此记下与我而言的部分重点 任何足够先进的技术都和魔法无异. --Arthur C. Clarke 作用域和闭包 编译原理 分 ...

  9. 十分钟快速了解《你不知道的 JavaScript》(上卷) 1

    最近刚刚看完了<你不知道的 JavaScript>上卷,对 JavaScript 有了更进一步的了解. <你不知道的 JavaScript>上卷由两部分组成,第一部分是< ...

最新文章

  1. DeepMind 的新强化学习系统是迈向通用 AI 的一步吗?
  2. R语言使用pROC包绘制ROC曲线并使用smooth函数绘制平滑的ROC曲线(方法包括:binormal、density、fitdistr、logcondens、logcondens.smooth)
  3. 第三次作业+105032014101
  4. Perl 变量(1)--纯变量
  5. 远程服务器电脑的设置
  6. java怎么一段字符串全为数字_java 如何判断一个字符串是数字
  7. vant popover offset
  8. java中10个用户注册_JavaWeb(十)Session
  9. 结构化分析方法是一种自下而上逐步求精的分析方法【软件项目管理】
  10. 2.程序员的自我修养---编译和链接
  11. 【转】 叫人起床的学问
  12. 爬虫框架Scrapy之Spider
  13. STM32 f103 实现命令终端
  14. 理想费米气体的量子统计推导
  15. 关于阻止迅雷上传,带慢计算机的工具
  16. 护理学跨考计算机专业,什么是跨专业考研?
  17. 网络安全笔记8——虚拟专网技术
  18. html美食网站源码
  19. 删除Windows服务
  20. java发送html模板的高逼格邮件

热门文章

  1. Python数据分析实战【第三章】2.5-Pandas数据结构Dataframe:基本概念及创建【python】
  2. 5-2交换实数下面的程序,输入两个实数,交换后输出。请在空白处填写适当内容完成此程序。#include <stdio.h>void RealSwap(double *x, doubl
  3. 学习FFmpeg API –解码视频
  4. Must specify port after ':' in connection string问题
  5. matlab dmc控制代码,【原创】Matlab实现DMC控制加热炉程序
  6. Galil DMC-3425
  7. Unity制作简陋版跑酷
  8. 搭建企业gitlab私有仓库全过程
  9. Python手册(Python Basics)--Python进阶
  10. 燕十八 mysql_布尔教育燕十八mysql优化视频课件源码分享