函数得隐藏属性
1、arguments
arguments在函数重载和高阶函数中会反复用到。
函数重载:函数名相同,函数的参数列表不同(包括参数个数和参数类型),根据参数的不同去执行不同的操作。
举例:
function overload(a){
console.log('一个参数')
}
function overload(a,b){
console.log('两个参数')
}
// 在支持重载的编程语言中,比如 java
overload(1); //一个参数
overload(1,2); //两个参数
// 在 JavaScript 中
overload(1); //两个参数
overload(1,2); //两个参数
js中可以使用arguments进行函数重载效果
function overload () {
if (arguments.length === 1) {
console.log('一个参数')
}
if (arguments.length === 2) {
console.log('两个参数')
}
}
overload(1); //一个参数
overload(1, 2); //两个参数
升级版:高阶函数
function addMethod (object, name, fn) {
// 先把原来的object[name] 方法,保存在old中
var old = object[name];
// 重新定义 object[name] 方法
object[name] = function () {
// 如果函数需要的参数 和 实际传入的参数 的个数相同,就直接调用fn
if (fn.length === arguments.length) {
return fn.apply(this, arguments);
// 如果不相同,判断old 是不是函数,
// 如果是就调用old,也就是刚才保存的 object[name] 方法
} else if (typeof old === "function") {
return old.apply(this, arguments);
}
}
}
2、this
改变this指针得方式:
apply(this,[a1,a2...])
call(this,a1,a2....)
3、函数得四种调用方式
a、作为函数调用(作为作用环境得属性)(this指全局对象)
b、作为对象得方法(this指当前对象)
c、作为构造函数(this指实例对象)
d、通过apply和call作为替换调用(this指第一个参数对象)
4、递归:函数内部调用自己或者函数内部函数调用自己得函数。
函数作为对象属性得递归调用,由于是匿名函数,注意引用的丢失。
解决办法:使用内联定义即可。再起一个函数名字即可。
使用name可以判断是否为匿名函数。
欢迎star本人github:https://github.com/flyku