函数对象
1.函数属性
①length属性
·在函数体里,arguments.length表示传入函数的实参的个数。
·而函数本身的length属性是只读的,它代表函数声明的实际参数的数量。
function fn(a, b) {
console.log(arguments.length);
console.log(fn.length);
console.log(arguments.callee.length);
}
fn(1, 2, 3, 4, 5);
②prototype属性
·每一个函数都包含一个prototype属性,这个属性是指向一个对象的引用,这个对象称做"原型对象"(prototype object)。每一个函数都包含不同的原型对象。当将函数用做构造函数的时候,新创建的对象会从原型对象上继承属性。
③自定义属性
·函数是一种特殊的对象,可以拥有属性。
javascript
function fx(a, b) {
if (fx.count) fx.count++;
else fx.count = 1; return a + b;
}
fx(1, 2);fx(2, 3);fx(3, 4);fx(4, 5);
console.log(fx.count);
2.函数方法
. ①call()和apply()方法
·通过调用方法的形式来间接调用函数。
·call()和apply()的第一个实参是要调用函数的主体对象,它是调用上下文,在函数体内通过this来获得对它的引用。
②bind()方法
·将函数绑定至某个对象,且可以绑定参数值。
·当在函数f()上调用bind()方法并传入一个对象o作为参数,这个方法将返回一个新的函数。
·(以函数调用的方式)调用新的函数将会把原始的函数f()当做o的方法来调用。
·传入新函数的任何实参都将传入原始函数。
·通过bind()为函数绑定调用上下文后,返回的函数不能通过call和apply修改调用上下文对象。
bind()方法示例
let obj = {
x: 10,
show: function (y) {
let r = "";
for (let i = 0; i < y; i++) {
r += this.x + " ";
}
console.log(r);
},
};
obj.show(4);
let ss = obj.show.bind({ x: 1000 });
ss(3);
ss.call({ x: 2000 }, 3);
bing()应用举例
let obj = { z: 1000 };
function sum(x, y) {
let r = x + y;
if (Object.getPrototypeOf(this) != window) {
console.log(this); r += this.z;
}
return r;
}
obj.sum = sum;
console.log(obj.sum(20, 30));
console.log(obj.sum.call({ z: 1 }, 2, 3));