每天一章犀牛书——CHAP8:函数
1. 函数定义
函数表达式:函数名称可有可无。若有函数名,则在函数体内指代该函数本身,并且只存在于函数体中。函数名称 === arguments.callee
函数声明:存在函数提升。变量只提升变量并不提升赋值,函数提升整个函数体都会提升,因此可在声明前调用函数。不能存在于循环。条件判断、try/cache、with等语句中。在ES6中可以。
构造函数:使用new Function()若传入一个参数则这个参数为函数体,传入多个参数则前面的都是函数实参,最后一个参数为函数体。在函数创建时解析,效率比前两种慢。运行的时候只能访问自己的本地变量和全局变量,不能访问Function构造器被调用生成的上下文的作用域。在全局作用域中创建执行。
2. 函数调用
2.1 函数调用
参数:计算参数表达式的值作为函数的实参传递给声明时的形参;
返回值:(1)在执行到return语句时返回,返回值为return之后的值。(2)若return后无值或者函数没有return语句(执行到函数末尾)则返回undefined.
调用上下文(this):非严格模式下是全局对象(window),严格模式下是undefined.
2.2 方法调用
如果函数表达式是作为 对象的属性调用 ,则为方法调用。
参数:与普通函数相同。
返回值:与普通函数相同。
调用上下文(this):调用该方法的对象就是调用上下文。实质是给函数传入隐式的实参——调用该方法的对象。
方法链:如果方法的返回值是一个对象,则返回的对象还可以再调用它的方法形成方法链。当方法不需要返回值时,最好之间返回this形成方法链。
this是关键字,没有作用域的限制。如果嵌套函数作为方法调用,则this指向调用它的对象。如果嵌套函数作为普通函数调用,则this指向全局对象或者undefined.
2.3 构造函数调用
在函数或者方法调用之前使用关键字new,则为构造函数调用。创建一个新的对象,继承构造函数的prototype属性。
参数:与普通函数相同。作为初始化对象的参数。
返回值:如果return语句返回一个对象,则这个对象为返回值。如果return没有返回值或者返回原始值,则这个新创建的对象作为返回值。
调用上下文(this):新创建的对象。
2.4 间接调用
使用`call()`,`apply()`方法显示制定调用所需的this值,使任何函数可以作为任何对象的方法调用。
3. 函数的实参和形参
形参:函数中定义的变量
实参:运行时的函数调用传入的参数
当实参个数 arguments指向实参对象的引用,是一个类数组对象,可通过数字下标访问传入的实参值,该对象只在函数内部有效。arguments[]应用场景是函数需要固定个数的命名必须参数和不定数的可选实参。arguments有两个属性:length和callee.length属性表示传入函数的实参的个数,callee指向当前执行的函数。当参数过多时,可以使用对象的属性作为参数。解决参数顺序的问题。
4. 闭包
闭包:函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内。
函数的作用域链是在函数定义的时候创建的,并且在函数执行时依然有效。作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域"中的变量。对于不存在嵌套函数的函数体内,作用域上有两个对象:一是定义函数参数和局部变量的对象,二是全局对象。当函数返回时,从作用域链中将这个绑定变量的对象删除,如果没有其他引用指向这个绑定对象,则这个对象会被当做垃圾回收掉。但是在存在嵌套函数中,嵌套函数有自己的作用域链,并且这个作用域链指向一个变量绑定对象。因此,当外部函数将嵌套函数作为返回或者存储在某处的属性里时,就有外部引用指向嵌套函数,嵌套函数指向外部函数的变量对象,因此这个变量对象就不会被回收,还能访问。主要用于私有变量和私有方法。
5. 函数的属性和方法
5.1 函数的属性
length属性:表示函数的形参的个数。即函数希望传入多少个参数。
prototype:当将函数用作构造函数的时候,新创建的对象会从原型对象上继承属性。
5.2 函数的方法
call(),apply():使任何函数可以作为任何对象的方法调用。第一个参数传入调用上下文。对于call()来说第二个参数传入函数调用需要的实参。对于apply()来说第二个参数传入一个数组或者类数组对象,该数组包含函数调用的实参。
bind():创建一个新的函数。第一个参数传入新函数的调用上下文,后面的参数是函数调用的参数依次使用。
6. 函数式编程
高阶函数:接受一个或多个函数作为参数,并返回一个新函数。
不完全函数:可参照bind的应用。
记忆函数:使用私有变量作为缓存。
关键字:JavaScript
版权声明
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!