zoukankan      html  css  js  c++  java
  • 《你不知道的JavaScript(上)》笔记——提升

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

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

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

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

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

    5.思考以下代码:

    foo();
    
    function foo() {
        console.log(a); // undefined
        var a = 2;
    }

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

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

    function foo() {
        var a;
        console.log(a);
        a = 2
    }
    
    foo()

    这样就好理解多了。

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

    思考以下代码:

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

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

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

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

    思考以下代码:

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

    结果输出1而不是2

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

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

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

    8.看以下代码:

    var a = 2;

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

    var a;
    a = 2;

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

  • 相关阅读:
    ImageLoader配置(凝视)
    Javaproject集成log4j 2.x
    kafka入门样例 for java
    php&&页面静态化
    Windows 下Oracle database 9i 64bit 仅仅有 Windows Itanium 64bit
    苹果新的编程语言 Swift 语言进阶(三)--基本运算和扩展运算
    Visual Studio2008 和2010 执行程序出现的黑框马上消失解决方法
    Cocos2d-x 3.0 Schedule in Node
    zend framework获取数据库中枚举类enum的数据并将其转换成数组
    OpenGl 坐标转换
  • 原文地址:https://www.cnblogs.com/cathy1024/p/10452064.html
Copyright © 2011-2022 走看看