前端技术专家面试-函数&对象

78 阅读4分钟

1. 函数

  1. C函数与javascript函数的区别

    1. C语言
      1. 机器指令序列:C语言的函数本质上是一串机器指令的集合。
      2. 不可传递:C语言中,函数不能作为参数传递给其他函数。
      3. 函数指针:函数指针存储的是函数在内存中的地址,而不是函数本身。
      4. 静态类型:C语言是静态类型语言,函数的参数类型和返回类型在编译时就已确定。
      5. 编译时绑定:C语言的函数调用通常在编译时就确定了(除非使用函数指针)。
    2. JavaScript函数:
      1. 动态性:JavaScript函数是动态的,可以在运行时创建和修改;函数在JavaScript中是对象,可以有属性和方法。
      2. 可传递:函数可以作为参数传递,可以赋值给变量,可以作为返回值。
      3. 动态类型:JavaScript是动态类型语言,函数参数和返回值的类型在运行时确定。
  2. “一等公民”的来历

对于编程语言来说:一等公民肯定包含基本数据类型;由于Javascript中函数和基本数据类型差不多, 所以有了javascript是一等公民这个说法。下面是一等公民的特征

  • 被赋值给变量
  • 作为参数传递给函数
  • 作为函数的返回值
  • 存储在数据结构中
  1. 栈帧:

    • 栈帧(Stack Frame) 是在函数调用时存储执行上下文的一个结构,它包含了与函数执行相关的信息。
    • 函数被调用时:JavaScript 引擎会为该函数创建一个新的栈帧,并将其推入调用栈(Call Stack)中。
    • 函数执行完时:栈帧在函数执行完毕后会被弹出。
    interface ScopeChain {
      variables: Record<string, any>;  // 当前作用域的变量
      outerScope?: ScopeChain | null;  // 外层作用域(可选,可以为 null)
    }
    // 定义 StackFrame 接口,描述栈帧结构
    interface StackFrame {
      functionName: string;                  // 函数名称
      args: any[];                           // 函数参数
      localVariables: Record<string, any>;   // 局部变量对象
      scopeChain: ScopeChain[];              // 作用域链
      thisContext: any;                      // 上下文 (this)
      returnAddress: string;                 // 返回地址
    }
    
    • functionName:函数名称
    • args:通过 arguments 对象访问
    • localVariables:局部变量也存储在栈帧中,这些变量只能在函数的作用域内访问。
    • scopeChain:作用域链,词法作用域的变量就在这里。
    • thisContext:上下文 (this),thisContext的值取决于函数的调用方式(普通函数、对象方法、构造函数等)
      1. 普通函数调用
        • 在非严格模式下,this指向全局对象(浏览器中是window,Node.js中是global)
        • 在严格模式下,this为undefined
      2. 对象方法调用:this指向调用该方法的对象
      3. 构造函数调用:this指向新创建的对象实例
      4. 箭头函数:this继承自外层作用域的this值,不会被调用方式影响
      5. call()、apply()和bind()方法:可以显式地指定函数执行时的this值
      6. DOM事件处理函数:this通常指向触发事件的元素
      7. 内联事件处理
        • HTML中的onclick等属性,this指向所属的DOM元素
        • returnAddress:返回地址
  2. 调用方式

    • 普通调用:创建执行上下文(栈帧);压入调用栈;执行函数体;返回值处理;执行上下文出栈
    • new调用:创建新对象;设置原型;绑定this;执行构造函数;返回对象;执行上下文出栈;
      • 设置原型(将新对象的[[Prototype]](即__proto__)链接到构造函数的prototype属性);
      • 绑定this(将构造函数的this绑定到新创建的对象);
      • 返回对象: 如果构造函数没有显式返回对象,则返回步骤a中创建的对象 如果构造函数显式返回了一个对象,则返回该对象;如果返回的是原始类型,则忽略,仍返回新创建的对象
  3. 箭头函数

    • 主要目的:简化书写、简化理解、提高运行性能。
    • 栈帧(Stack Frame): 箭头函数的**栈帧(Stack Frame)**比普通函数的内容简单。
    1. 没有自己的this:箭头函数不绑定自己的this,而是继承自外围作用域的this。
    2. 没有arguments对象:箭头函数没有自己的arguments对象,但可以使用剩余参数(...args)来获取参数列表。
    3. 不能用作构造函数:不能使用new关键字调用箭头函数。
    4. 箭头函数不能用作生成器函数,因此不能使用yield关键字。

1. 对象