[JS 权威指南] 第八章 函数
函数定义
函数挂载在一个对象上, 作为对象的一个属性, 称为对象的方法,
通过这个对象调用是, 该对象就是此次调用的上下文, 也就是函数的 this
JS 函数可以嵌套在其他函数中定义,
这样就可以访问他们被定义时所处的作用域的任何变量
构成了一个闭包
函数调用
函数调用
作为函数 作为方法 作为构造函数 通过它们的 call() 和 apply() 方法间接调用
任何函数只要作为方法调用实际上都会传入一个隐式的实参
这个实参是一个对象, 就是调用方法的母体
方法链: 当方法的返回值是一个对象, 这个对象还可以再调用它的方法
每次的调用结果都是另外一个表达式的组成部分
函数或方法调用之前带有关键字 new, 就构成了构造函数调用
构造函数调用创建一个新的空对象, 这个对象继承自构造函数的 prototyoe 属性
间接调用 call 和 apply 可以间接调用函数,
call 使用它自由的实参列表作为函数的实参 apply 要求以数组的形式传入参数
函数参数
可变参数
- function test(/*...*/){
- return arguments.length // 返回传入参数的个数
- }
可变参数的个数不能为 0
arguments 不是真正的数组, 是一个实参对象
callee 是标准的, 指代当前正在执行的函数
可以在匿名函数中递归调用自身
- var test =function(x){
- if(x<=1) retun 1;
- return x * arguments.calle(x-1);
- }
caller 是非标准的, 指代调用当前正在执行的函数的函数
可以访问调用栈
JS 中是无法声明只在一个代码块内可见的变量的
可以定义一个函数用作临时的命名空间
在这个命名空间内定义的变量都不会污染到全局命名空间
- (function() {
- // function 之前的括号, 是把这个函数当作表达式解析
- }()) // 最后一个括号是立即调用该函数
定义一个匿名函数并立即调用
闭包
函数的执行依赖于变量作用域
这个作用域是在函数定义时决定的
JS 函数对象的内部状态, 不仅包含代码逻辑, 还必须引用当前的作用域链
函数对象可以通过作用域链相互关联起来
函数体内部的变量都可以保存在函数作用域内
这种特性称为闭包
闭包是活动的
嵌套的函数不会将作用域内的私有成员复制一份
也不会对所绑定的变量生成静态快照的
this 是 JS 的关键字, 每个函数调用都包含一个 this 值,
如果闭包在外部函数里是无法访问 this 的, 除非外部函数将 this 转存为一个变量
函数的属性
每个函数都包含一个 prototype 属性
这个属性是指向一个对象的引用
这个对象称做原型对象
每一个函数都包含不同的原型对象
当函数用作构造函数的时候,
新创建的对象会从原型对象上继承属性
call,apply 通过调用方法的形式来间接调用函数
第一个参数是要调用函数的母对象, 是调用上下文 ,this
在函数体内通过 this 来获得对它的引用
- // 调用 o 对象的函数 f()
- f.call(o)
- f.apply(o)
内置函数往往返回一个类似 [native code] 的字符串作为函数体
高阶函数, 就是操作函数的函数
接收一个参数, 并返回一个新的函数
缓存 memorize 接收一个函数作为实参, 并返回带有记忆能力的函数
来源: https://www.2cto.com/kf/201809/780858.html