浏览器中js的执行机制
变量提升
代码会先编译再执行
编译期间会发生变量声明提升和函数声明提升
变量提升其实是变量声明的提升
变量生命的提升会设置默认值undefined
声明式函数提升包含整个函数体
重名的情况:
1. 如果声明式函数和声明式函数重名,则使用后者
2. 如果变量和声明式函数重名,则变量的提升会被忽略
调用栈
调用栈,是执行上下文的栈
每执行一个函数,就会形成一个执行上下文,压入栈中
执行上下文包括:变量环境 + 词法环境
函数执行完成之后,会出栈
栈的大小是有限制的,如果一直压栈,就会造成栈溢出
var的缺陷以及为什么要有let和const
什么是作用域?
作用域就是变量与函数的可访问范围,即作用域控制着变量和函数的可见性和生命周期
var定义的变量存在变量生命的提升,变量提升会造成一些问题,比如:
1. 变量突然被篡改
2. 变量没有正确的被回收(for循环)
块级作用域是通过词法环境的栈结构实现,变量提升是通过变量环境实现
总结:块级作用域是通过词法环境的栈结构实现,变量提升是通过变量环境实现。
ES6 明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。(暂时死区)
作用域链
作用域链是作用域中寻找变量的一条链路
作用域链路由词法作用域(代码结构:由代码中函数声明的位置来决定)决定
块级作用域查找顺序如下图:
闭包
闭包是变量的集合,内部函数访问外部函数的局部变量,并且返回内部函数,访问的这些局部变量的集合就称为一个闭包,闭包是一个object,则实际数据存在了堆内存中。
This指向
js执行上下文分为三种:全局执行上下文;函数执行上下文和eval执行上下文
全局执行上下文中的this指向window
函数执行上下文:
1. 默认也是指向window
2. 设置this
- call,apply,bind修改this指向
- 对象调用函数,this指向调用函数的当前对象
- 构造函数中的this,指向new出来的实例
-
function CreateObj() { this.name = 'JFrameSea' } var obj = new CreateObj(); // new 的实际过程 /** * 1. 创建一个空对象 * 2. 修改构造函数的this为该空对象 * 3. 返回该空对象 */ var tempObj = {} CreateObj.call(tempObj) return tempObj
JFrameSea: 你说的标签是指的什么
鑫有林夕有鑫: web那边怎么调用得标签
Lansonli: 原创不易,过来支持一下~
Rex~: 很棒呀,学习啦,谢谢分享!