JavaScript里的概念:提升

简介: JavaScript里的概念:提升

声明与赋值谁在前

先看两个例子


例子1:

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


例子2:

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


例子1:为什么结果不是 undefined 。

例子2:为什么结果不是 抛出 ReferenceError 异常。

那为什么会出现这个结果呢?


编译器再度来袭


为了弄清这个问题,再次需要了解编译器的内容。

引擎会在解释 JavaScript 代码之前首先对其进行编译。编译阶段中的一部分工作就是找到所有的声明,并用合适的作用域将它们关联起来。



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


上面的两个例子就很好理解了。


以例子2为例:

console.log( a ); // undefined
var a = 2;
// 先编译,后执行   等价于
var a;
console.log( a );
a = 2;


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

注意:每个作用域都会进行提升操作。声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。



函数优先


函数声明和变量声明都会被提升。(有多个“重复”声明的代码中)是函数会首先被提升,然后才是变量


例子1:

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


这个代码会被引擎理解为:

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


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


尽管重复的 var 声明会被忽略掉,但出现在后面的函数声明还是可以覆盖前面的。

例子:

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


目录
相关文章
|
22天前
|
存储 JavaScript 前端开发
解释 JavaScript 中的作用域和作用域链的概念。
【4月更文挑战第4天】JavaScript作用域定义了变量和函数的可见范围,静态决定于编码时。每个函数作为对象拥有`scope`属性,关联运行期上下文集合。执行上下文在函数执行时创建,定义执行环境,每次调用函数都会生成独特上下文。作用域链是按层级组织的作用域集合,自内向外查找变量。变量查找遵循从当前执行上下文到全局上下文的顺序,若找不到则抛出异常。
21 6
|
2月前
|
JavaScript 前端开发 网络协议
​Node.js 教程(一) 基本概念与基本使用
​Node.js 教程(一) 基本概念与基本使用
|
3月前
|
JavaScript 前端开发 Java
Node.js专题讲解 第1期 概念篇
Node.js专题讲解 第1期 概念篇
23 0
|
3月前
|
JavaScript 前端开发
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
Node.js中的EventEmitter模块:基本概念、使用方法和常见应用场景
62 0
|
4月前
|
自然语言处理 JavaScript 前端开发
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
作用域的概念及作用?作用域的分类?.js 属于哪种作用域?
33 0
|
4月前
|
前端开发 JavaScript
JavaScript 前端框架相关: React、Vue或Angular中组件化的概念是什么?
JavaScript 前端框架相关: React、Vue或Angular中组件化的概念是什么?
79 3
|
4月前
|
负载均衡 JavaScript 算法
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
Node.js 多进程的概念、原理、优势以及如何使用多进程来提高应用程序的性能和可伸缩性
43 1
|
1月前
|
移动开发 前端开发 JavaScript
编程笔记 html5&css&js 002 一些基本概念
编程笔记 html5&css&js 002 一些基本概念
|
2月前
|
存储 JavaScript 前端开发
JavaScript基础:了解核心概念和技能
JavaScript基础:了解核心概念和技能
55 1
|
3月前
|
消息中间件 自然语言处理 JavaScript
【面试题】你理解中JS难理解的基本概念是什么?
【面试题】你理解中JS难理解的基本概念是什么?