代码很简单,但是有个很有趣的东西。
我们都知道: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的几个要点:
- 提升的是声明,赋值、可执行的代码段是不提升的。
-
提升是按照作用域来提升的,即声明只能提升到所在作用域的最上面。例子:
foo(); function foo() { console.log( a ); // undefined var a = 2; }
这段代码的执行过程其实是这样的:function foo() { var a; console.log( a ); // undefined a = 2; } foo();
-
函数声明(Function delaration)能提升,但是函数表达式(Function expression)不能提升,例:
foo(); // not ReferenceError, but TypeError! var foo = function bar() { // ... };
参考:
-------------------------------------------------------------------------------------------------------------------------------------
相关推荐
- 基本类型:ECMAScript 5.1中有五种基本数据类型,包括Undefined、Null、Boolean、Number和String,以及一个特殊类型Object。 - 引用类型:Object类型是所有复杂数据结构的基础,包括数组、函数和自定义对象。 -...
ECMAScript 6,简称ES6,是JavaScript语言的一个重要版本,它在2015年正式发布,引入了大量的新特性和语法改进,为前端开发带来了显著的提升。ES6的发布标志着JavaScript语言向更现代化、更强大和更规范的方向发展。...
JavaScript是一种广泛应用于网页和网络应用的脚本语言,它的...在JavaScript-master这个项目中,很可能是包含了关于JavaScript和ECMAScript学习的相关资源和示例代码,进一步深入研究将有助于深化对这些概念的理解。
在ECMAScript 6(简称ES6)中,引入了一个重要的新特性——Class对象,它为JavaScript提供了更接近传统面向对象编程语言的语法结构。在ES5以前,JavaScript使用构造函数和原型链来实现面向对象的特性,而ES6的Class...
### ECMAScript 6 (ES6) 技术扫盲 #### 1. let、const 和 block 作用域 在 ES6 中引入了 `let` 和 `const` 关键字来替代原有的 `var` 来声明变量。这些新关键字不仅提供了更好的作用域控制,而且也避免了一些与 `...
ECMAScript 6,简称ES6,是JavaScript语言的一个重要版本更新,引入了许多新的特性和语法改进。本文将深入探讨其中两个关键特性:`let` 和 `const`。 `let` 是ES6中用于声明变量的新关键字,它解决了在ES5中`var`...
ECMAScript,作为JavaScript语言的标准,提供了丰富的功能和机制,其中函数是其核心特性之一。在ECMAScript中,函数不仅是可执行的代码块,它们实际上也是对象,具备属性和方法。这意味着函数名是引用函数对象的指针...
ECMAScript 6,也称为ES6,是JavaScript语言的一个重大更新,引入了许多新的特性和改进,其中就包括块级作用域和新变量声明方式——`let`关键字。在ES5之前,JavaScript只有一种全局作用域和函数作用域,而没有块级...
ECMAScript,通常简称为ES,是JavaScript编程语言的标准,由欧洲计算机协会(ECMA)制定。变量作用域是编程中的一个核心概念,它决定了变量的可见性和生命周期。在JavaScript中,理解变量作用域对于编写可维护和无...
Promise有三种状态,分别是pending(等待中)、fulfilled(已完成)和rejected(已拒绝),并且可以通过then和catch方法处理不同状态的结果。 总的来说,"javascript-978-1-7858-8268-5:学习ECMAScript 6"这本书...
**ES2015,又称为ECMAScript 6(ES6)或ECMAScript 6.0,是JavaScript语言的一个重要更新版本。这个版本引入了大量的新特性,旨在提高开发效率,增强语言功能,以及更好地支持大型项目开发。在"es6samples"这个示例...
其中,let和const关键字解决了变量提升(hoisting)的问题,它们在块级作用域内有效。箭头函数(=>)简化了函数定义,如(x, y) => x + y。模板字符串用反引号(`)包裹,支持插值,如`Hello, ${name}`。此外,ES6还...
4. **某些函数和属性**:JScript 有一些特有的函数和属性,例如`escape()`和`unescape()`,这些在后来的ECMAScript版本中被废弃。 5. **错误报告**:JScript 的错误报告机制与JavaScript中的不同,通常更偏向于提供...
虽然现在Babel更受欢迎,但了解Traceur对于理解ES6的早期实现和转码原理是有帮助的。 **3. let 和 const 命令** 在ES6中,`let`和`const`是两个新的变量声明关键字,它们解决了JavaScript中`var`的一些问题。 **...
JavaScript是ECMAScript规范的一个实现,主要用来处理客户端(浏览器)上的事件、数据和用户交互。它与HTML和CSS一起,构成了网页开发的三驾马车。JavaScript可以用于创建动态网页,比如响应式按钮、表单验证、动画...
`let`允许块级作用域的变量声明,防止变量提升(hoisting)和意外覆盖。`const`则用于声明不可变的常量,一旦赋值就不能改变。 2. **模板字符串**: 使用反引号(``)定义的模板字符串,支持内联表达式 `${expression}...
JavaScript是一种广泛应用于网页和网络应用开发的脚本语言,它基于ECMAScript规范,并由Netscape公司的Brendan Eich在1995年首次设计。JavaScript在浏览器环境中执行,使得它可以动态地修改HTML、CSS和处理用户交互...
函数表达式和函数声明是JavaScript中定义函数的两种方式,它们在执行时机和提升(hoisting)上有区别。箭头函数是ES6引入的新特性,它提供了更简洁的语法,但其this指向与普通函数不同,总是指向定义时所在的作用域...
`let`允许块级作用域,防止变量提升(hoisting)和意外修改,而`const`则用于声明不可变常量。 **2. **箭头函数**:** 箭头函数(=>)提供了更简洁的函数定义方式,其this值绑定到定义时所在的上下文,而非调用时,...
JScript 是一种基于ECMAScript标准的脚本语言,由Microsoft开发,主要用于Windows操作系统和Internet Explorer浏览器环境。它与JavaScript非常相似,但在某些语法和特性上存在细微差别。《JScript 语言参考》中文版...