浏览器中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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值