• 浏览器中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出来的实例
      1. function CreateObj() {
      2. this.name = 'JFrameSea'
      3. }
      4. var obj = new CreateObj();
      5. // new 的实际过程
      6. /**
      7. * 1. 创建一个空对象
      8. * 2. 修改构造函数的this为该空对象
      9. * 3. 返回该空对象
      10. */
      11. var tempObj = {}
      12. CreateObj.call(tempObj)
      13. return tempObj

  • 相关阅读:
    WakaTime一个用于跟踪和分析编程时间的工具
    微信小程序实现lot开发01 学习微信小程序 helloworld
    kmalloc、kzalloc、vmalloc、kmem_cache_alloc的区别
    每天一个数据分析题(四百零一)- 逻辑回归
    前端面试问题(jwt/布局/vue数组下标/扁平化/菜单树形/url api/新版本)
    高数_第3章_重积分_习题
    Python异常使用三大注意事项详解!
    Curator实现Zookeeper分布式锁
    biopython----bio.PDB
    miRNA测序数据生信分析——第四讲,未知物种的生信分析实例
  • 原文地址:https://blog.csdn.net/qq_14855277/article/details/126271645