1. 函数
-
C函数与javascript函数的区别
- C语言
- 机器指令序列:C语言的函数本质上是一串机器指令的集合。
- 不可传递:C语言中,函数不能作为参数传递给其他函数。
- 函数指针:函数指针存储的是函数在内存中的地址,而不是函数本身。
- 静态类型:C语言是静态类型语言,函数的参数类型和返回类型在编译时就已确定。
- 编译时绑定:C语言的函数调用通常在编译时就确定了(除非使用函数指针)。
- JavaScript函数:
- 动态性:JavaScript函数是动态的,可以在运行时创建和修改;函数在JavaScript中是对象,可以有属性和方法。
- 可传递:函数可以作为参数传递,可以赋值给变量,可以作为返回值。
- 动态类型:JavaScript是动态类型语言,函数参数和返回值的类型在运行时确定。
- C语言
-
“一等公民”的来历
对于编程语言来说:一等公民肯定包含基本数据类型;由于Javascript中函数和基本数据类型差不多, 所以有了javascript是一等公民这个说法。下面是一等公民的特征
- 被赋值给变量
- 作为参数传递给函数
- 作为函数的返回值
- 存储在数据结构中
-
栈帧:
- 栈帧(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的值取决于函数的调用方式(普通函数、对象方法、构造函数等)
- 普通函数调用
- 在非严格模式下,this指向全局对象(浏览器中是window,Node.js中是global)
- 在严格模式下,this为undefined
- 对象方法调用:this指向调用该方法的对象
- 构造函数调用:this指向新创建的对象实例
- 箭头函数:this继承自外层作用域的this值,不会被调用方式影响
- call()、apply()和bind()方法:可以显式地指定函数执行时的this值
- DOM事件处理函数:this通常指向触发事件的元素
- 内联事件处理
- HTML中的onclick等属性,this指向所属的DOM元素
- returnAddress:返回地址
- 普通函数调用
-
调用方式
- 普通调用:创建执行上下文(栈帧);压入调用栈;执行函数体;返回值处理;执行上下文出栈
- new调用:创建新对象;设置原型;绑定this;执行构造函数;返回对象;执行上下文出栈;
- 设置原型(将新对象的[[Prototype]](即__proto__)链接到构造函数的prototype属性);
- 绑定this(将构造函数的this绑定到新创建的对象);
- 返回对象: 如果构造函数没有显式返回对象,则返回步骤a中创建的对象 如果构造函数显式返回了一个对象,则返回该对象;如果返回的是原始类型,则忽略,仍返回新创建的对象
-
箭头函数
- 主要目的:简化书写、简化理解、提高运行性能。
- 栈帧(Stack Frame): 箭头函数的**栈帧(Stack Frame)**比普通函数的内容简单。
- 没有自己的this:箭头函数不绑定自己的this,而是继承自外围作用域的this。
- 没有arguments对象:箭头函数没有自己的arguments对象,但可以使用剩余参数(...args)来获取参数列表。
- 不能用作构造函数:不能使用new关键字调用箭头函数。
- 箭头函数不能用作生成器函数,因此不能使用yield关键字。