函数的属性
length属性
用于记录该函数拥有的参数数量(函数定义式的参数列表长度).
function f(a, b, c) {}
f.length
constructor属性
Function含有构造器属性(constructor),构造器属性引用的是Function()构造器函数
function f(a, b, c) {}
f.constructor
caller属性
这个函数会返回一个调用该函数对象的外层函数引用.如果我们在函数B中调用函数A,那么只要在函数A中调用A.caller,结果就回得到函数B.
function A() {return A.caller;}
function B() {console.log(A());}
B();
当在全局作用域中调用函数A,将得到null
自定义属性
函数是一种特殊的对象,因此函数可以像对象一样拥有(或指定)属性。自定义属性的适用场景——静态变量。
function f () {
return f.count++
}
f.count = 1
f[1] = 2 // 也可以使用[]指定属性
f() // 1
f() // 2
函数的方法
call()和apply()
call()和apply()方法起到间接调用函数的作用。两个方法都是显示指定this值。区别:call方法的使用实参列表作为函数的实参,apply方法则是以数组形式传递参数。
function F () {
this.x = 1
this.y = 2
this.f1 = function () {
console.log('x: ' + this.x + ', y: ' + this.y)
return this
},
this.f2 = function (i, j) {
this.x = i
this.y = j
}
}
// 直接调用,f1方法的this就是调用该方法的对象
var f = new F()
var c = f.f1() // 输出x: 1, y: 2。此时f1方法的this就是对象f
c === f // true
var m = {x: 5}
var m1 = f.f1.call(m) // x: 5, y: undefined。对象m没有y属性,因此this.y为undefined。 间接调用,此时f1方法的this===m 等价于f.f1.apply(m)
m === m1 // true
f.f2.call(m, 6, 5) // call方法的参数列表与f2方法一致,等价于f.f2.apply(m, [6, 5])
m.x // 6
m.y // 5