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

  • 相关阅读:
    Integer 使用不当导致生产的事故
    Android/Automotive 多声道录音支持
    嵌入式汇编大合集
    Java_String类
    万能适配器basequickadapter + recycleview实现单选并且默认选择第一个
    Redis哨兵
    Java设计模式之建造者模式详解(Builder Pattern)
    C++试卷(程序设计题)
    【基础架构设计】仿12306系统公共组件设计深度解析
    代码随想录算法训练营Day52|动态规划11
  • 原文地址:https://blog.csdn.net/qq_14855277/article/details/126271645