Javascript之hoisting变量提升
javascript不仅仅是一门弱类型语言,还是一门解释型语言。一门编程语言的本质就是这样,优点即是缺点,缺点也往往是优点。JS因为有了变量提升,能够使我们在编程时可以忽略“先声明,再使用”的规则,但也正是JS变量提升的存在,使得我们编程时一不留神就掉进了陷阱。
先来看一段代码:
a="test";
var a;
console.log(a);
按理说应该输出Undefined,但是结果却是:“test”。
实际上js代码在执行的整个过程中是有所谓的编译期,只不过这个编译期很短暂,但却不可忽略,编译期间js引擎做了很多事情:词法分析,作用域链的构建等,还有一个就是提升,声明的提升,包括变量的声明和函数的声明,提升到何处?提升到作用域的顶端。
也就是说,Hoisting:在变量(或者函数)的作用域内,不管变量(或者函数)在何处声明,都会被提升到作用域的顶部,但是变量(或者函数)初始化的顺序不变。换句话说“var a=2”会被拆分成“var a;a=2”两个部分,前一个部分会hoisting到作用域的顶端,而后一部分放在原地不变。
下面来看一些JS变量提升的两个规则。
一、函数声明提升,函数表达式不提升
foo();
var func=function foo(){
console.log(a);
var a="test c";
}
等价于
var func;
foo();
func=function foo(){
var a;
console.log(a);//Undefined
a="test c";
}
二、函数提升优先于变量提升
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);
}
Javascript之hoisting变量提升的更多相关文章
- Javascript作用域和变量提升
下面的程序是什么结果? var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么 ...
- javascript Hoisting变量提升
1. 看人家举的两个例子,我认为这里的判断是否定义: !var 其实就是 指是否在函数function里面定义了.只有在funciton里面定义了了,js才hoist到最上面去找这个变量的值,否则就按 ...
- 谈谈javascript中的变量提升还有函数提升
在很多面试题中,经常会看到关于变量提升,还有函数提升的题目,所以我就写一篇自己理解之后的随笔,方便之后的查阅和复习. 首先举个例子 foo();//undefined function foo(){ ...
- JavaScript中的变量提升和严格模式
1.什么是变量提升 所谓的变量提升指的是:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体(作用域)的最顶部. //先声明后使用 var x; console.log(x) ...
- JavaScript中的变量提升和函数提升
在EcmaScript5中只有全局作用域和函数作用域,EcmaScript6增加了块级作用域. 块级作用域(一对花括号{}即为一个块级作用域) 变量提升 console.log(name); //un ...
- JavaScript 作用域和变量提升
本文是这篇文章的简单翻译. 如果按照下面的代码按照JavaScript程序的执行方式执行,alert函数会显示什么? var foo = 1; function bar() { if (!foo) { ...
- 简单谈一谈JavaScript中的变量提升的问题
1,随笔由来 第一天开通博客,用于监督自己学习以及分享一点点浅见,不出意外的话,应该是一周一更或者一周两更. 此博客所写内容主要为前端工作中遇上的一些问题以及常见问题,在此基础上略微发表自己的一点浅 ...
- JavaScript中变量提升------Hoisting
原谅链接:http://www.cnblogs.com/damonlan/archive/2012/07/01/2553425.html 因为这个问题很是经典,而且容易出错,所以在介绍一次.哈哈.莫怪 ...
- JavaScript变量提升和函数声明预解析
1.首先理解函数作用域 在JavaScript中,变量的定义并不是以代码块作为作用域的,而是以函数作用作用域的.也就是说,如果变量是在某个函数中定义的,那么它在函数以外的地方是不可见的.而如果该变量是 ...
随机推荐
- zabbix-proxy及ELK
1.添加tomcat监控模版 yum install java-1.8.0-openjdk tomcat-webapps tomcat-admin-webapps tomcat-docs-webapp ...
- Docker——概念学习
百度百科概念: Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化.容器是完全 ...
- mysql安装好需要启动和停止服务
启动mysql: mysql.server start 停止服务:mysql.server stop
- java基础(8)---接口和lambda
一.接口 接口定义: 接口抽象方法定义: 二.接口实现类的定义.创建.调用 接口需要一个实现类. 接口实现类的定义: 接口实现类的创建和调用: 接口的好处: 不好的写法: 推荐的写法: 接口实 ...
- python网络-HTTP协议(28)
一.服务器和客户端介绍 1.什么是服务器? 简而言之:提供服务的机器就是服务器,至于提供什么服务不重要,重要的是要给其他人提供服务.例如:FTP服务器可以提供文件下载,SMTP服务器等等,不同的服务器 ...
- 学习markdown(一)
转:https://www.jianshu.com/p/81e1608ea2d8 ----------------------------------------------------------- ...
- 牛客NOIP暑期七天营-普及组1 解题报告
A 对于\(100\%\),直接开个桶统计即可.入门题目. 代码:https://ac.nowcoder.com/acm/contest/view-submission?submissionId=41 ...
- Docker初识笔记
Docker docker说白了就是:环境打包 我们能用docker什么? 1.如果配置好本地的linux环境交接给其他人,很麻烦,交接时要告诉他,装这个装那个,还可能出现问题,那我直接把这个环境放到 ...
- Sharding-JDBC(二)2.0.3版本实践
目录 一.Sharding-JDBC依赖 二.分片策略 1. 标准分片策略 2. 复合分片策略 3. Inline表达式分片策略 4. 通过Hint而非SQL解析的方式分片的策略 5. 不分片的策略 ...
- Java入门程序HelloWord
Java程序开发三步骤:编写,编译,运行 编译器(编译):javac.exe 解释器(运行):java.exe 编译:把我们能看得懂的java代码(xxx.java)翻译成jvm可以运行的java字节 ...