1.引言

初学js不久,还是发现js和其他编程语言(java,C#…)有些不一样的,一些强类型语言中带过来的“固化”的思想在js中可能会让你莫名其妙,what?这特么也可以?下面介绍的就是其中之一,javascript hoisting 机制,也就是js提升机制咯。本篇不在传道受业,仅仅是方便个人复习翻阅,文中若有纰漏,请留言指出,不必留情。

2.Hoisting

先提一个问题:解释语言是不是一行一行的从上到下的执行,读一行,翻译一行?在回答这个问题之前,不妨来看看这个简单的示例(Demo1):

        a="test a"var a;console.log(a);

会输入什么?显然Undefined,var a;在后面啊,默认值不是Undefined吗,但是结果却是:“test a”

那这样写行不行呢?(Demo2:结果显示却是你意料之中的“Undefined”)

    console.log(a);var a="test b";

实际上js代码在执行的整个过程中是有所谓的编译期,只不过这个编译期很短暂,但却不可忽略,编译期间js引擎做了很多事情:词法分析,作用域链的构建等,还有一个就是提升,声明的提升,包括变量的声明和函数的声明,提升到何处?提升到作用域的顶端,也就是说,Hoisting:在变量(或者函数)的作用域内,不管变量(或者函数)在何处声明,都会被提升到作用域的顶部,但是变量(或者函数)初始化的顺序不变。换句话说“var a=2”会被拆分成“var a;a=2”两个部分,前一个部分会hoisting到作用域的顶端,而后一部分放在原地不变(函数的声明后面会有介绍,稍安勿躁!),干说理论蛋疼,现在结合上面的Demo1和Demo2看看:

Demo1:由于变量a的声明会提升到作用于的顶端,初始化的位置没有变化,所以它等价于下面的代码,显而易见输出结果“test a”。

        var a;a="test a"console.log(a);

Demo2:等价于下面的代码,输出的是变量a的默认值Undefined。

        var a;console.log(a);a="test b";

值得注意的是上面说的是变量的Hoisting,函数的Hoisting大同小异,但是还是有一些注意的地方:

1. 函数声明提升,函数表达式不提升

        foo();var func=function foo(){console.log(a);var a="test c";}

等价代码:

       var func;foo();func=function foo(){var a;console.log(a);//Undefineda="test c";}

而不是等价于:

       function foo(){var a;console.log(a);a="test c";}var func;foo();func=foo;

2. 函数提升优先于变量提升

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


实际上上述代码等价于:

        function foo(){console.log(1);}var foo;foo=3;foo();//TypeError:此时foo被覆盖,已变成一个变量了foo=function(){console.log(2);}

3.注意

  • 尽量避免函数名与变量名重复,当然一般做项目过程中也不会重复的,只是在一些面试题里面出现,用来考察你对Hoisting的理解深入程度。
  • Hoisting提升到作用域的顶端,所以应该避免在块中声明变量或者函数,因为块容易被看成一块作用域(ES6中的块级作用域除外)。
  • 声明本身会被提升,而包括函数表达式的赋值在内的赋值操作并不会提升。

Javascript Hoisting相关推荐

  1. 什么是Javascript Hoisting?

    Javascript是一门容易遭人误解的语言,但是它的强大毋庸置疑.个人觉得,要想深入理解Javascript语言,首先必须对其基本的概念(例如:Scope,Closure,Hoisting等)要真正 ...

  2. JavaScript hoisting(变量提升)学习总结

    定义:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部. JavaScript 中,变量可以在使用后声明,也就是变量可以先使用再声明. 例如一下两个例子: 例1: ...

  3. javascript提升(Hoisting)详解

    JavaScript(Hoisting)提升:是JavaScript将声明移动至端部的默认行为. 1.JavaScript声明会被提升 在JavaScript中,可以在使用变量之后对其进行声明,也就是 ...

  4. JavaScript学习(五)

    JavaScript 正则表达式 正则表达式是构成搜索模式(search pattern)的字符序列.该搜索模式可用于文本搜索和文本替换操作. 例:var patt = /w3school/i; 例子 ...

  5. javascript_javascript吊装

    javascript Hoisting is a JavaScript mechanism where variables and function declarations are moved to ...

  6. matlab火炮射击问题_15个快速射击前端面试问题

    matlab火炮射击问题 重点 (Top highlight) HTML中的DOM是什么? (What is the DOM in HTML?) The Document Object Model ( ...

  7. JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念...

    JavaScript中hoisting(悬置/置顶解析/预解析) 实例解释,全局对象,隐含的全局概念 <html><body><script type="tex ...

  8. 【repost】JavaScript Scoping and Hoisting

    JavaScript Scoping and Hoisting Do you know what value will be alerted if the following is executed ...

  9. JavaScript提升(Hoisting)---借鉴自W3CSchool

    为何记录这个?因为感觉还挺酷,跟其他语言还有点不同 何为提升? 提升(Hoisting)是 JavaScript 将声明移至顶部的默认行为. 简单来说,就是可以先赋值,后定义.这个应该是JavaScr ...

最新文章

  1. 1003个微生物基因组数据发布
  2. treeview递归绑定的两种方法
  3. 硬盘三步操作( 分区、格式化、挂载)
  4. AMUL的完整形式是什么?
  5. CF940D Alena And The Heater
  6. c语言 静态变量 初始化,c – 静态变量初始化两次
  7. C++:传递数组给函数
  8. element筛选 ajax,vue使用element Transfer 穿梭框实现ajax请求数据和自定义查询
  9. nginx限流方案的实现(三种方式)
  10. ecs mysql 安装_CentOS8 安装MySQL8(ECS系列二)
  11. python语言中浮点数_在Python中截断浮点数
  12. PDF虚拟打印机(virtual printer)软件汇总
  13. pytest中参数化方法,并且根据执行的命令进行动态参数化
  14. 数据结构 | 有关树和二叉树的详解【内附考点精析】
  15. Java实现短信验证码最佳实践
  16. 记录 zookeeper集群配置参数 flume配置参数
  17. html标签中的style=visibility:visible
  18. 【解禁】钉钉直播回放下载
  19. php 通联支付demo,通联支付接口示例源码(.net/php/java)
  20. 皓龙服务器系列怎么样,双核皓龙服务器导购

热门文章

  1. 在用计算机编程进行潮流计算时,《电力系统分析》课程 - 图文
  2. 同时显示世界各地时间的会走动的时钟
  3. 「每日分享」Maven实战
  4. TR069 RPC 测试
  5. 申请版权登记应该怎么申请
  6. linux下jmap 内存命令,Linux下jmap命令查看内存使用
  7. for语句、while语句及循环结束语句的介绍
  8. ssm学生心理健康测评网的规划与设计
  9. (Python3)视频转字符动画初学者超详细实战,亲测有效!
  10. python怎么输入小数啊_如何在python中打小数点