`
MirrorAvatar
  • 浏览: 48466 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ECMAScript Hoisting和“先有鸡还是先有蛋”

阅读更多

代码很简单,但是有个很有趣的东西。

 

我们都知道:JavaScript代码是由上而下,逐行解释执行的。

 

那么先看这段代码:

a = 2;

var a;

console.log( a );

控制台上会输出什么?

或许你会觉得是输出个undefined ,因为a定义声明是在a=2这个赋值声明之后的,console.log(a)的时候,a是没有赋值的,所以是undefined 。然而事实并非如此。输出是:2。

 

再看这段代码:

console.log( a );

var a = 2;

通过上面的例子:或许你觉着是输出2,或者抛ReferenceError 错。但这两个想法都是错的。输出是undefined 。

 

这两段代码阐述了一个问题:先有鸡还是先有蛋。

用JavaScript语言来提问就是:先有声明(declaration ),还是先有赋值(assignment)?

 

-------------------------------------------------------------------------------------------------------------------------------------

 

对于JavaScript来说是,先有声明。

 

如何来理解“先有声明”呢?

JavaScript代码在执行之前,会编译一下(compile first),编译的其中一部分就是,变量和函数的声明。

 

对于上面两个例子可以这样来解释:

第一段代码根据执行顺序,可以这样来理解:

第一步:

var a;

第二步:

a = 2;

console.log(a);

 

 

对于第二段代码,可以这样来理解:

第一步:

var a;

第二步:

console.log(a)//所以才undefined

a =2 ;

 

上面的这个过程就是JavaScript声明提升(Hoisting)。提升嘛,就是从底层位置到高层位置。

 

 

-------------------------------------------------------------------------------------------------------------------------------------

Hoisting的几个要点:

 

  1. 提升的是声明,赋值、可执行的代码段是不提升的。
  2. 提升是按照作用域来提升的,即声明只能提升到所在作用域的最上面。例子:
    foo();
    
    function foo() {
        console.log( a ); // undefined
    
        var a = 2;
    }
     这段代码的执行过程其实是这样的:
    function foo() {
        var a;
    
        console.log( a ); // undefined
    
        a = 2;
    }
    
    foo();
     
  3. 函数声明(Function delaration)能提升,但是函数表达式(Function expression)不能提升,例:
    foo(); // not ReferenceError, but TypeError!
    
    var foo = function bar() {
        // ...
    };
     

 

参考:

JavaScript Hoisting

 

 

 

 

 

 

 

 

 

 

-------------------------------------------------------------------------------------------------------------------------------------

 

0
1
分享到:
评论

相关推荐

    ECMAScript5.1中文版说明

    - 基本类型:ECMAScript 5.1中有五种基本数据类型,包括Undefined、Null、Boolean、Number和String,以及一个特殊类型Object。 - 引用类型:Object类型是所有复杂数据结构的基础,包括数组、函数和自定义对象。 -...

    【技术分享】ECMAScript6.pptx

    ECMAScript 6,简称ES6,是JavaScript语言的一个重要版本,它在2015年正式发布,引入了大量的新特性和语法改进,为前端开发带来了显著的提升。ES6的发布标志着JavaScript语言向更现代化、更强大和更规范的方向发展。...

    JavaScript:JavaScript存储区和ECMAScript

    JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的...在JavaScript-master这个项目中,很可能是包含了关于JavaScript和ECMAScript学习的相关资源和示例代码,进一步深入研究将有助于深化对这些概念的理解。

    详解ECMAScript6入门--Class对象

    在ECMAScript 6(简称ES6)中,引入了一个重要的新特性——Class对象,它为JavaScript提供了更接近传统面向对象编程语言的语法结构。在ES5以前,JavaScript使用构造函数和原型链来实现面向对象的特性,而ES6的Class...

    ECMAScript 6 技术扫盲,快速学习ES6,进入Javascript开发ES6时代

    ### ECMAScript 6 (ES6) 技术扫盲 #### 1. let、const 和 block 作用域 在 ES6 中引入了 `let` 和 `const` 关键字来替代原有的 `var` 来声明变量。这些新关键字不仅提供了更好的作用域控制,而且也避免了一些与 `...

    浅谈ECMAScript6新特性之let、const

    ECMAScript 6,简称ES6,是JavaScript语言的一个重要版本更新,引入了许多新的特性和语法改进。本文将深入探讨其中两个关键特性:`let` 和 `const`。 `let` 是ES6中用于声明变量的新关键字,它解决了在ES5中`var`...

    ECMAScript 创建自己的js类库

    ECMAScript,作为JavaScript语言的标准,提供了丰富的功能和机制,其中函数是其核心特性之一。在ECMAScript中,函数不仅是可执行的代码块,它们实际上也是对象,具备属性和方法。这意味着函数名是引用函数对象的指针...

    ECMAScript6块级作用域及新变量声明(let)

    ECMAScript 6,也称为ES6,是JavaScript语言的一个重大更新,引入了许多新的特性和改进,其中就包括块级作用域和新变量声明方式——`let`关键字。在ES5之前,JavaScript只有一种全局作用域和函数作用域,而没有块级...

    ECMAscript 变量作用域总结概括

    ECMAScript,通常简称为ES,是JavaScript编程语言的标准,由欧洲计算机协会(ECMA)制定。变量作用域是编程中的一个核心概念,它决定了变量的可见性和生命周期。在JavaScript中,理解变量作用域对于编写可维护和无...

    javascript-978-1-7858-8268-5:学习ECMAScript 6

    Promise有三种状态,分别是pending(等待中)、fulfilled(已完成)和rejected(已拒绝),并且可以通过then和catch方法处理不同状态的结果。 总的来说,"javascript-978-1-7858-8268-5:学习ECMAScript 6"这本书...

    es6samples:ECMAScript 6示例

    **ES2015,又称为ECMAScript 6(ES6)或ECMAScript 6.0,是JavaScript语言的一个重要更新版本。这个版本引入了大量的新特性,旨在提高开发效率,增强语言功能,以及更好地支持大型项目开发。在"es6samples"这个示例...

    js笔记整理BOM和DOM,es5和es6

    其中,let和const关键字解决了变量提升(hoisting)的问题,它们在块级作用域内有效。箭头函数(=>)简化了函数定义,如(x, y) => x + y。模板字符串用反引号(`)包裹,支持插值,如`Hello, ${name}`。此外,ES6还...

    JScript 语言参考

    4. **某些函数和属性**:JScript 有一些特有的函数和属性,例如`escape()`和`unescape()`,这些在后来的ECMAScript版本中被废弃。 5. **错误报告**:JScript 的错误报告机制与JavaScript中的不同,通常更偏向于提供...

    es6标准入门1

    虽然现在Babel更受欢迎,但了解Traceur对于理解ES6的早期实现和转码原理是有帮助的。 **3. let 和 const 命令** 在ES6中,`let`和`const`是两个新的变量声明关键字,它们解决了JavaScript中`var`的一些问题。 **...

    JavaScriptTest

    JavaScript是ECMAScript规范的一个实现,主要用来处理客户端(浏览器)上的事件、数据和用户交互。它与HTML和CSS一起,构成了网页开发的三驾马车。JavaScript可以用于创建动态网页,比如响应式按钮、表单验证、动画...

    es6:ECMAScript 6Türkçeçeviri

    `let`允许块级作用域的变量声明,防止变量提升(hoisting)和意外覆盖。`const`则用于声明不可变的常量,一旦赋值就不能改变。 2. **模板字符串**: 使用反引号(``)定义的模板字符串,支持内联表达式 `${expression}...

    js笔记,预编译/原型/

    JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它基于ECMAScript规范,并由Netscape公司的Brendan Eich在1995年首次设计。JavaScript在浏览器环境中执行,使得它可以动态地修改HTML、CSS和处理用户交互...

    javascript共享资料

    函数表达式和函数声明是JavaScript中定义函数的两种方式,它们在执行时机和提升(hoisting)上有区别。箭头函数是ES6引入的新特性,它提供了更简洁的语法,但其this指向与普通函数不同,总是指向定义时所在的作用域...

    ExploringES6的翻译可以在此处阅读最新的翻译

    `let`允许块级作用域,防止变量提升(hoisting)和意外修改,而`const`则用于声明不可变常量。 **2. **箭头函数**:** 箭头函数(=>)提供了更简洁的函数定义方式,其this值绑定到定义时所在的上下文,而非调用时,...

    《JScript 语言参考》中文版.chm

    JScript 是一种基于ECMAScript标准的脚本语言,由Microsoft开发,主要用于Windows操作系统和Internet Explorer浏览器环境。它与JavaScript非常相似,但在某些语法和特性上存在细微差别。《JScript 语言参考》中文版...

Global site tag (gtag.js) - Google Analytics