【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现
console.log( a );
var a = 2;
执行输出undefined
a = 2;
var a;
console.log( a );
执行输出2
说明:javaScript 运行时在编译器阶段会最先处理var a;也就是变量被提升
foo();
function foo() {
console.log( a ); // undefined var a = 2;
var a = 2;
}
执行输出undefined,执行foo();时找到了函数的声明,但实际代码写在foo()的后面。说明函数声明会被提升,函数作用域里变量也会被提升
foo();
var foo = function bar() {
console.log(a)
var a =2
};
执行输出TypeError: foo is not a function,说明函数表达式不会被提升,foo() 由于对 undefined进行调用抛出TypeError异常
var foo;
foo(); // 1
foo = function() {
console.log( 2 );
};
function foo() {
console.log( 1 );
}
执行输出1,说明虽然函数和变量都能被提升,但是函数声明提升优先于变量声明提升
foo(); // 3
function foo() {
console.log( 1 );
}
var foo = function() {
console.log( 2 );
};
function foo() {
console.log( 3 );
}
执行输出3,后面的函数声明会覆盖前面的函数声明
总结
var 变量声明和函数声明其实跟javaScript运行原理有关,在javaScript运行之前会先进行编译,在编译阶段会先为变量和函数根据作用域规则开辟内存空间并初始化变量为undefined,而函数是初始化函数变量并且直接赋值函数体,以便在执行的时候方便查找和存储。
let , const到底有没有有变量提升?
console.log(a)
let a=2
输出:ReferenceError: Cannot access 'a' before initialization,表明变量没有被定义,不能在变量为初始化之前使用。其实从这句话看来js是找到了变量a的,但a还没有被初始化;这样看来,let其实也有变量提升(在我理解上来说,提升就是先为变量创造内存空间),js 处理let声明变量的过程:
{
let x = 1
x = 2
}
1、查找let声明的变量x,并在作用域中创建变量,不进行初始化
2、执行代码x=1,初始化为1
3、执行x = 2赋值为2
let 特性
let a=2
let a=3
console.log(a)
输出:SyntaxError: Identifier 'a' has already been declared,不能重复定义变量
参考资料
《你不知道的javaScript 上卷》第四章 变量提升
【你不知道的javaScript 上卷 笔记3】javaScript中的声明提升表现的更多相关文章
- 你不知道的JavaScript上卷笔记
你不知道的JavaScript上卷笔记 前言 You don't know JavaScript是github上一个系列文章 初看到这一标题的时候,感觉怎么老外也搞标题党,用这种冲突性比较强的题目 ...
- 【你不知道的javaScript 上卷 笔记2】 javaScript 的作用域规则
一.什么是词法作用域? 词法作用域是在定义词法阶段的作用域,就是由代码变量和作用域块写在哪里决定的,基本上词法分析器在处理代码时会保持作用域不变. 二.词法作用域特点 完全由写代码期间函数所声明的位置 ...
- Javascript学习笔记1 javascript的特点
..对于网页而言,Javascript无处不在,对于英语不好的人它简直是噩梦般的存在,但形式所逼,今天开始着手学习!希望自己能坚持下去.从什么地方着手,我的目标是从大处着眼,从应用着眼,不抠细节,反正 ...
- JavaScript学习笔记(4)——JavaScript语法之变量
一.变量可以使用短名称(比如 x 和 y),也可以使用描述性更好的名称(比如 age, sum, totalvolume). 变量必须以字母开头 变量也能以 $ 和 _ 符号开头(不过我们不推荐这么做 ...
- 1.2(JavaScript学习笔记)JavaScript HTML DOM
一.DOM DOM全称为document object model(文档对象模型). 此处的文档指当前HTML文档,对象指HTML标签. 当网页被加载时,浏览器会创建页面的文档对象模型. 下面结合具体 ...
- Javascript学习笔记3 Javascript与BOM简介
什么是BOM BOM是browser object model的缩写,简称浏览器对象模型 BOM提供了独立于内容而与浏览器窗口进行交互的对象 由于BOM主要用于管理窗口与窗口之间的通讯,因此其核心对象 ...
- 【你不知道的javaScript 上卷 笔记7】javaScript中对象的[[Prototype]]机制
[[Prototype]]机制 [[Prototype]]是对象内部的隐试属性,指向一个内部的链接,这个链接的作用是:如果在对象上没有找到需要的属性或者方法引用,引擎就 会继续在 [[Prototyp ...
- 【你不知道的javaScript 上卷 笔记6】javaScript中的对象相关内容
一.创建一个对象的语法 var myObj = { key: value // ... };//字面量 var myObj = new Object(); //new myObj.key = valu ...
- 【你不知道的javaScript 上卷 笔记5】javaScript中的this词法
function foo() { console.log( a ); } function bar() { var a = 3; foo(); } var a = 2; bar(); 上面这段代码为什 ...
随机推荐
- ArcMap制图遇到的小问题
情况一 在attributes table中查看,发现是一条记录,实际上这一条记录由多个面要素组合而成,且彼此间没有交集,现在需要把他们全部分开来,单独独立变成一条要素记录 方法: Editor--& ...
- 泡泡后台Couchbase缓存使用经验分享
一.导读 爱奇艺的社交业务“泡泡”,拥有日活用户6千万+,后台系统每日高峰期间接口QPS可以达到80K+,与视频业务的主要区别是泡泡业务更多地引入了与用户互动相关的数据,读.写的量均很大.无论是庞大的 ...
- Kakfa集群(2.11-0.10.1.0)版本滚动升级方案
Kafka集群版本升级(2.11-0.10.1.0)升级(2.11-0.10.2.2) 官网升级说明: 一.系统环境Zookeeper集群:172.16.2.10172.16.2.11172.16.2 ...
- C#中的WinFrom技术实现串口通讯助手(附源码)
C#中的WinFrom技术实现串口通讯助手(附源码) 实现的功能: 1.实现自动加载可用串口. 2.打开串口,并且使用C#状态栏显示串口的状态. 3.实现了串口的接收数据和发送数据功能. 4.串口 ...
- warning: LF will be replaced by CRLF in
warning: LF will be replaced by CRLF in analysis/Result.csv. The file will have its original line en ...
- Django2.2 静态文件的上传显示,遇到的坑点-------已解决
前情提要:这里虽说是Django2.2 ,但经过测试发现Django 的其他版本也可以用此方法解决 一.项目根目录下的static文件的路由显示问题 在项目根目录下创建静态文件时发现,即使我配置了se ...
- Java源码系列2——HashMap
HashMap 的源码很多也很复杂,本文只是摘取简单常用的部分代码进行分析.能力有限,欢迎指正. HASH 值的计算 前置知识--位运算 按位异或操作符^:1^1=0, 0^0=0, 1^0=0, 值 ...
- 通过/dev/mem操作物理内存
/dev/mem设备可以用来访问物理内存.下面一段应用程序的代码,实现了通过/dev/mem对物理内存空间中SRAM1的访问. #include <stdio.h> #include &l ...
- ES6常用语法(二)
arrow functions (箭头函数) 函数的快捷写法.不需要 function 关键字来创建函数,省略 return 关键字,继承当前上下文的 this 关键字 // ES5 var arr1 ...
- intellji IDEA 2019版激活码(亲测可用 2019年10月14日08:53:54)
MNQ043JMTU-eyJsaWNlbnNlSWQiOiJNTlEwNDNKTVRVIiwibGljZW5zZWVOYW1lIjoiR1VPIEJJTiIsImFzc2lnbmVlTmFtZSI6I ...