We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
在上一篇文章(变量声明)中提到了变量提升,但是并没有详细的探讨什么是变量提升,为什么会变量提升等问题,今天这篇文章就主要探讨这两个问题
先引用MDN的解释
变量提升(Hoisting)被认为是, Javascript中执行上下文 (特别是创建和执行阶段)工作方式的一种认识。
通俗一点的解释就是:函数及变量的声明都将被提升到当前作用域的最顶部也就是变量可以先使用再声明
看一段代码
num = 10 console.log(num) // 10 var num foo() // 'foo' function foo(){ console.log('foo') }
运行上面的代码可以看到,变量num和函数foo都是在代码定义之前调用的,按照顺序执行的原则,在定义之前调用应该报错才对,但是这里却是正常执行,这就说明JavaScript并不是严格的顺序执行,而是存在变量提升
JavaScript先把变量和函数定义提升到代码顶部,所以上面例子中的代码其实际的执行顺序应该是这样的:
var num function foo() { console.log('foo') } num = 10 console.log(num) foo()
要深入了解变量提升的原因需要引入一个新的概念:执行上下文(关于什么是执行上下文,可以参考这篇文章:JavaScript深入之执行上下文栈)
执行上下文是JavaScript引擎在执行一段代码之前(编译阶段)的准备工作,也就是常说的编译内容;执行上下文中主要包含了三个非常重要的属性,分别是变量对象,作用域链,this;
执行上下文的调用可以分为两个阶段
a. 创建作用域链 b. 创建变量,函数及参数(创建变量对象) c. 求‘this’的值
指派变量的值和函数的引用,执行代码
因为这里主要探索变量提升的原因,所以了解变量对象的创建过程,变量对象的创建过程大概分为这几个阶段:
看一个例子:
function fun(i) { var a = 'hello' var b = function privateB() { } function c() { } } fun(1) // 当调用函数fun的时候,将创建一个执行对象,执行对象的内容如下: funExecutionContext = { // 创建作用域链 scopeChain: {}, // 创建变量对象 variableObject: { // 创建arguments对象并初始化 arguments: { 0: 1, length: 1 }, i: 1, // 扫描执行上下文中的函数声明 c: pointer to function c(), // 扫描上下文中的变量声明 a: undefined, b: undefined }, // 计算this this: {} }
在ES6中新增了let和const两个关键词可以声明变量,这两个关键词声明的变量不存在变量提升,必须先定义后使用
end
The text was updated successfully, but these errors were encountered:
mobei95
No branches or pull requests
在上一篇文章(变量声明)中提到了变量提升,但是并没有详细的探讨什么是变量提升,为什么会变量提升等问题,今天这篇文章就主要探讨这两个问题
什么是变量提升
先引用MDN的解释
通俗一点的解释就是:函数及变量的声明都将被提升到当前作用域的最顶部也就是变量可以先使用再声明
看一段代码
运行上面的代码可以看到,变量num和函数foo都是在代码定义之前调用的,按照顺序执行的原则,在定义之前调用应该报错才对,但是这里却是正常执行,这就说明JavaScript并不是严格的顺序执行,而是存在变量提升
JavaScript先把变量和函数定义提升到代码顶部,所以上面例子中的代码其实际的执行顺序应该是这样的:
为什么会提升
要深入了解变量提升的原因需要引入一个新的概念:执行上下文(关于什么是执行上下文,可以参考这篇文章:JavaScript深入之执行上下文栈)
执行上下文
执行上下文是JavaScript引擎在执行一段代码之前(编译阶段)的准备工作,也就是常说的编译内容;执行上下文中主要包含了三个非常重要的属性,分别是变量对象,作用域链,this;
执行上下文的调用可以分为两个阶段
1. 创建阶段(代码正式执行之前)
2. 代码执行阶段
因为这里主要探索变量提升的原因,所以了解变量对象的创建过程,变量对象的创建过程大概分为这几个阶段:
看一个例子:
如何避免变量提升
在ES6中新增了let和const两个关键词可以声明变量,这两个关键词声明的变量不存在变量提升,必须先定义后使用
总结
end
The text was updated successfully, but these errors were encountered: