摘要:所谓变量提升,提升就是为了事先声明变量。变量提升之后,但其赋值还是留在原本的位置等运行到了之后动态赋值,而函数提升之后直接相当于在代码里抽空了。搞明白这个例子也就搞懂了作用域中变量和函数是怎么提升的。
问题
在这个例子中它应该输出什么?输出的结果是6。
这个例子中它又该输出什么?输出的结果是a(),也就是输出了函数指针a。
这虽然是个变量和函数提升的问题,但是这两者到底是怎么提升的?
js是怎么创建变量的var a=1; var b=2;
这是不是声明了变量就立马接着给声明的变量赋值了?
js解析这个代码时,它实际上是按照如下方式解析的
var a; var b; a=1; b=2;
也就是js会先把所有变量都声明好了之后,然后才进行赋值,并不是声明一个变量就赋值,再声明一个再赋值。js所谓变量提升,提升就是为了事先声明变量。
上图中左边的例子,js解析时候是按照按照右边的代码解析的。js会把所有变量都集中提升到作用域顶部事先声明好,但是它赋值就就并不是像变量声明那样集中着一个个挨着赋值。原本书写赋值时写在哪里,那么js解析运行到那一行之后才会进行赋值,还没有运行到的就不会事先赋值。也就是变量会事先声明,但是变量不会事先赋值。
函数和变量都提升时,谁提到前面谁提到后面在作用域中,不管变量和函数写在什么位置,所有变量会被整体提升到作用域顶部,所有函数也会被整体提升到作用域顶部,但是函数整体在变量整体的后面。
从这个例子中可以看到,变量和函数都整体提升后,函数整体在变量的后面。变量提升之后,但其赋值还是留在原本的位置等js运行到了之后动态赋值,而函数提升之后直接相当于在代码里抽空了。
在这个更复杂一点的例子中,变量和函数提升后,js实际上就把它转变为了右边的代码在运行。
搞明白这个例子也就搞懂了作用域中变量和函数是怎么提升的。
结语回到开头的两个问题
它们各自被js转换后如上
一个思考题,这个例子该输出什么?
“提升”的本质就是为了事先声明变量和函数,当然函数只有声明式函数才会被提升,字面量函数不会被提升。这种提升就是存在于作用域中,包括全局作用域、函数作用域(闭包形成的作用域也是个函数作用域),总之都是在作用域中声明变量和函数时,会提升到作用域顶部,进行事先声明。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/88164.html
摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...
摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...
摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...
摘要:是词法作用域工作模式。使用可以将变量绑定在所在的任意作用域中通常是内部,也就是说为其声明的变量隐式的劫持了所在的块级作用域。 作用域与闭包 如何用js创建10个button标签,点击每个按钮时打印按钮对应的序号? 看到上述问题,如果你能看出来这个问题实质上是考对作用域的理解,那么恭喜你,这篇文章你可以不用看了,说明你对作用域已经理解的很透彻了,但是如果你看不出来这是一道考作用域的题目,...
阅读 2558·2021-11-15 11:38
阅读 2596·2021-11-04 16:13
阅读 17817·2021-09-22 15:07
阅读 996·2019-08-30 15:55
阅读 3235·2019-08-30 14:15
阅读 1646·2019-08-29 13:59
阅读 3189·2019-08-28 18:28
阅读 1561·2019-08-23 18:29