进阶系列

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    执行上下文是当前 JavaScript 代码被解析和执行时所在环境的抽象概念。

    执行上下文的类型

    执行上下文总共有三种类型

    • 全局执行上下文:只有一个,浏览器中的全局对象就是 window 对象,this 指向这个全局对象。

    • 函数执行上下文:存在无数个,只有在函数被调用的时候才会被创建,每次调用函数都会创建一个新的执行上下文。

    • Eval 函数执行上下文: 指的是运行在 eval 函数中的代码,

  • 本期的主题是作用域闭包,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    红宝书(p178)上对于闭包的定义:闭包是指有权访问另外一个函数作用域中的变量的函数
    关键在于下面两点:

    • 是一个函数
    • 能访问另外一个函数作用域中的变量

    对于闭包有下面三个特性:

    • 1、闭包可以访问当前函数以外的变量
    function getOuter(){
      var date = '815';
      function getDate(str){
        console.log(str + dat

  • 本期的主题是调用堆栈,本计划一共28期,每期重点攻克一个面试重难点,如果你还不了解本进阶计划,文末点击查看全部文章。

    如果觉得本系列不错,欢迎点赞、评论、转发,您的支持就是我坚持的最大动力。


    JS内存空间分为栈(stack)堆(heap)池(一般也会归类为栈中)。 其中存放变量,存放复杂对象,存放常量,所以也叫常量池。

    昨天文章介绍了堆和栈,小结一下:

    • 基本类型:--> 内存(不包含闭包中的变量)
    • 引用类型:--> 内存

    今日补充一个知识点,就是闭包中的变量并不保存中栈内存中,而是保存在堆内存中,这也就解释了函数之后之后为什么闭包还能引用到函数内的变量。

    fun
  • this的绑定规则总共有下面5种。

    • 1、默认绑定(严格/非严格模式)
    • 2、隐式绑定
    • 3、显式绑定
    • 4、new绑定
    • 5、箭头函数绑定

    1 调用位置

    调用位置就是函数在代码中被调用的位置(而不是声明的位置)。

    查找方法:

    • 分析调用栈:调用位置就是当前正在执行的函数的前一个调用

      function baz() {
          // 当前调用栈是:baz
          // 因此,当前调用位置是全局作用域
          
          console.log( "baz" );
          bar(); // <-- bar的调用位置
      }
      
      function bar() {
          // 当前调用栈是:baz -
  • 之前文章详细介绍了 this 的使用,不了解的查看【进阶3-1期】。

    call() 和 apply()

    call() 方法调用一个函数, 其具有一个指定的 this 值和分别地提供的参数(参数的列表)。

    call()apply()的区别在于,call()方法接受的是若干个参数的列表,而apply()方法接受的是一个包含多个参数的数组

    举个例子:

    var func = function(arg1, arg2) {
         ...
    };
    
    func.call(this, arg1, arg2); // 使用 call,参数列表
    func.apply(this, [arg1, arg2]