js权威指南基础学习
[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 接收一个函数作为实参,并返回带有记忆能力的函数