笔记摘自:《你不知道的JavaScript(上)》第3章 提升

1.包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。

2.变量和函数声明从它们在代码中出现的位置被“移动”到了最上面。这个过程就叫作提升。

3.只有声明本身会被提升,而赋值或其他运行逻辑会留在原地。

4.如果提升改变了代码执行的顺序,会造成非常严重的破坏。

5.思考以下代码:

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

foo函数的声明(这个例子还包括实际函数的隐含值)被提升了,因此第一行中的调用可以正常执行。

上面那段代码实际上会被理解为下面的形式:

  1. function foo() {
  2. var a;
  3. console.log(a);
  4. a = 2
  5. }
  6.  
  7. foo()

这样就好理解多了。

6.函数声明会被提升,但是函数表达式却不会被提升

思考以下代码:

  1. foo(); // TypeError 类型错误,实际上它是undefined
  2. bar(); // ReferenceError
  3.  
  4. var foo = function bar() {
  5. //...
  6. }

这个代码片段经过提升后,实际上会被理解为以下形式:

  1. var foo;
  2.  
  3. foo(); // TypeError
  4. bar(); // ReferenceError
  5.  
  6. foo = function bar() {
  7. //...
  8. }

7.函数优先,函数会首先被提升,然后才是变量。

思考以下代码:

  1. foo(); //
  2.  
  3. var foo;
  4.  
  5. function foo() {
  6. console.log(1);
  7. }
  8.  
  9. foo = function() {
  10. console.log(2);
  11. }

结果输出1而不是2

这段代码会被引擎理解为如下形式:

  1. function foo() {
  2. console.log(1);
  3. }
  4.  
  5. foo(); //
  6.  
  7. foo = function() {
  8. console.log(2)
  9. }

注意,var foo尽管出现在function foo() ...的声明之前,但它是重复的声明(因此被忽略了),因为函数声明会被提升到普通变量之前。

8.看以下代码:

  1. var a = 2;

实际上JavaScript引擎是这样理解的:

  1. var a;
  2. a = 2;

9.声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。

《你不知道的JavaScript(上)》笔记——提升的更多相关文章

  1. 你不知道的JavaScript上卷笔记

    你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章   初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...

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

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

  3. 【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现

    console.log( a ); var a = 2; 执行输出undefined a = 2; var a; console.log( a ); 执行输出2 说明:javaScript 运行时在编 ...

  4. 你不知道的javascript读书笔记3

    概述 这是我看<你不知道的JavaScript(中卷)>中关于类型检查的笔记,供以后开发时参考,相信对其他人也有用. typeof 我们知道js中有七种内置类型:undefined, nu ...

  5. 《你不知道的JavaScript》笔记(一)

    用了一个星期把<你不知道的JavaScript>看完了,但是留下了很多疑惑,于是又带着这些疑惑回头看JavaScript的内容,略有所获. 第二遍阅读这本书,希望自己能够有更为深刻的理解. ...

  6. 读书笔记-你不知道的JS上-声明提升

    变量声明提升 Javascript代码一般情况下是由上往下执行的,但是有些情况下不成立. a = 2; //变量声明被提升在当前作用域顶部 var a; console.log(a); console ...

  7. 《你不知道的javascript(上)》笔记

    作用域是什么 编译原理 分词/词法分析 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代码块被称为词法单元 解析/语法分析 词法单元流(数组)转换成一个由元素逐级嵌套所组成 ...

  8. <你不知道的JavaScript>读书笔记

    近几天看了一本不错的 JavaScript 的书,是 Kyle Simpson 写的 <You Don't know JS>.这本书是 Kyle Simpson 在 Github 上的开源 ...

  9. 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制

    [[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...

  10. 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容

    一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...

随机推荐

  1. 在AT151上面测试串口通讯

    如下图所示,分别用putty打开两个窗口,一个是串口打开的,另外一个是网口连接的,分别是接收和发送,硬件上面RXD和TXD进行短接进行数据回流. 使用microcom工具,ctrl+x可以退出 参考文 ...

  2. Vim操作的四种模式

    Vim的四种模式一.启动Vim1.双击桌面的图标,就可以启动Vim(是图形界面的)2.在开始菜单---点--运行 接着输入 vim 或者gvim,就可以启动Vim或Gvim了.二.Vim的模式1.Vi ...

  3. Peer To Peer——对等网络

    今年的考试.大问题没怎么出现. 就是考英语第二天的下午,发生网络阻塞的现象,不影响大局.可是事出有因,我们还是须要看看是什么影响到了考生抽题.最后查了一圈,发现其它几场的英语考试听力都是19M大小,而 ...

  4. 73,QT指针数组实战(指针数组与数组指针)

    //指针数组,每一个指针都是一个MainWindow // MainWindow *w[3][4]; // for(int i=0;i<3;i++) // { // for(int j=0;j& ...

  5. POJ 2227 FloodFill (priority_queue)

    题意: 思路: 搞一个priority_queue 先把边界加进去 不断取最小的 向中间扩散 //By SiriusRen #include <queue> #include <cs ...

  6. 压状态bfs

    一般地图很小,状态不多,可以装压或者hash,构造压缩或hash的函数,构造还原地图的函数,然后就无脑bfs(感觉就是SPFA) 题目: 1.玩具游戏:二进制压缩状态 #include<cstd ...

  7. mktemp---创建暂存文件

  8. netstat---显示Linux中网络系统的状态信息

    netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux系统的网络情况. 语法 netstat(选项) 选项 -a或--all:显示所有连线中的Socket: -A<网 ...

  9. Android开发之ConstraintLayout相对布局

    介绍 一个 ConstraintLayout 是一个 ViewGroup 允许您以灵活的方式定位和调整小部件的方法. 注意: ConstraintLayout 作为支持库提供,您可以在API级别9(G ...

  10. 【习题 8-12 UVA - 1153】Keep the Customer Satisfied

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 结束时间比较早的,就早点开始做. 所以,将n件事情,按照结束时间升序排. 然后对于第i件事情. 尽量把它往左排. 即t+1..t+a ...