JavaScript 声明提前机制
声明提前机制
在JavaScript存在着这样一种预处理机制,即浏览器在解析JS代码时会将var声明的变量和function声明的函数提升到当前作用域的顶部。但是解析JS代码时对var和function关键字声明的对象的处理是不一样的:前者在解析时只是将声明提前了,但是赋值却依旧在原来的位置。而后者不仅将声明提前了,而且将定义也完成。具体请看下面的例子:
console.log(hello); //undefined
sayHi(); //hi var hello = "hello";
console.log(hello); //hello function sayHi() {
console.log("hi");
}
在第一行输出一个在下面用var声明并且赋值的hello变量,没有报错但是输出的是undefined,说明hello变量的声明确实是被提前了但是没有赋值,所以输出的是undefined。正是因为给变量赋值依旧在原来的位置,所以第五行输出hello变量可以正常输出。在处理function定义的sayHi函数时,sayHi的声明被提前了,同时也对它进行了定义,所以在第二行调用sayHi时正常输出hi而不是报 sayHi is not defined 或者sayHi is not a function的错。
函数声明优先于变量声明
需要注意的是:函数声明优先于变量声明,看下面例子:
console.log(sayHi); // ƒ sayHi() { console.log("hi"); }
var sayHi = "sayHi";
function sayHi() {
console.log("hi");
}
console.log(sayHi); // sayHi
先用var声明变量sayHi并赋值为"sayHi",然后用function再将sayHi重新声明为一个函数。在声明的前后输出sayHi,发现前面输出的是一个函数,后面输出的是一个字符串"sayHi"。显然可以看出函数声明是优先于变量声明的。
这篇博客正好也解释了我之前写的一篇函数声明与函数表达式的区别,感兴趣的可以去看一下。
JavaScript 声明提前机制的更多相关文章
- javascript --- 声明提前(学习笔记)
声明提升 未声明变量 console.log(a); 在没有定义 a 的情况下,直接使用,会报错. 声明变量 console.log(a); var a = 2; 输出结果:undefined 并不会 ...
- 初探JavaScript(四)——作用域链和声明提前
前言:最近恰逢毕业季,千千万万的学生党开始步入社会,告别象牙塔似的学校生活.往往在人生的各个拐点的时候,情感丰富,感触颇深,各种对过去的美好的总结,对未来的展望.与此同时,也让诸多的老“园”工看完这些 ...
- 【翻译】JavaScript中的作用域和声明提前
原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译开始=== 你知道下面的JavaScript脚本执 ...
- JavaScript中的作用域和声明提前
[翻译]JavaScript中的作用域和声明提前 原文:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html ===翻译 ...
- JavaScript变量声明提前
上周四吃完午饭,leader发了一道JavaScript的题目给我们做,我们Team里面有做前端的,有做后台的,也有做mobile web的,所以大家对题目的理解各自都不一样,然后在QQ讨论组里面进行 ...
- JavaScript 变量声明提前
<JavaScript权威指南>中指出:JavaScript变量在声明之前已经可用,JavaScript的这个特性被非正式的称为声明提前(hoisting),即JavaScript函数中声 ...
- javascript篇-----函数作用域,函数作用域链和声明提前
在一些类似C语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码段之外是不可见的(也就是我们不能在代码段外直接访问代码段内声明的变量),我们称之为块级作用域,然而,不同于 ...
- javascript中函数作用域和声明提前
javascript不像java等其他强类型语句,没有块级作用域(括号内的代码都有自己的作用域,变量在声明它们的代码段之外不可见)一说,但有自己的独特地方,即函数作用域. 函数作用域:变量在声明它们的 ...
- javascript中的函数作用域和声明提前
在一些类C的编程语言中,花括号内的每一段代码都具有各自作用域,并且变量在声明他们的代码段之外是不可见的,这个概念叫做块级作用域. javascript中没有块级作用域的概念,有的是函数作用域的概念:变 ...
随机推荐
- [Ubuntu] Git可视化比较工具 P4Merge 的安装/配置及使用
1 下载 下载地址. 链接到上面的下载页后,先找到左边导航的 Clients ,如下图 1 所示. 接着找到 P4Merge: Visual Merge Tool , 如下图 2 所示. 最后,选择好 ...
- [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
- POJ 3414 pots (未解决)
http://poj.org/problem?id=3414 #include <iostream> #include <cstdio> #include <queue& ...
- 我的WafBypass之道(SQL注入篇)
原帖地址:https://xianzhi.aliyun.com/forum/read/349.html 0x00 前言 去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常 谈的话题 ...
- Palindromic Matrix
Palindromic Matrix time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- css的position,float属性的理解
我们知道,html是按照普通流来加载的,这个时候我们有些需求就不好实现.因此出现了非普通流: 1.普通流:按照顺序正常的排列,长度或不够就往下挤.position默认的static 2.非普通流:脱离 ...
- Installing Ruby 2.2 on Centos7
准备做redis-cluster,需要ruby2.2环境 开整环境:Centos7.2最小安装yum源:阿里的base和epel源 ********************************** ...
- HTML5 - Canvas【申明:来源于网络】
HTML5 - Canvas 地址:http://hwaphon.site/
- Android无法删除项目+导入项目报错
Android无法删除项目+导入项目报错 Android无法删除项目:关闭eclipse或关闭电脑,然后重启,继续删除就可以了 导入项目报错:右键–>配置–>中就可以看到了,更改一下就可以 ...
- 使用Xshell调用linux的图形界面!
环境说明: OS: centos 6.5 64位,最小化安装. Xmanager: 17.0.0.714 1.设置Xshell 2.将操作系统安装如下包 yum install xclock xte ...