JavaScript学习笔记4_Function对象的属性和call/apply方法

函数的属性

length属性

用于记录该函数拥有的参数数量(函数定义式的参数列表长度).

function f(a, b, c) {}
f.length
image.png

constructor属性

Function含有构造器属性(constructor),构造器属性引用的是Function()构造器函数

function f(a, b, c) {}
f.constructor
image.png

caller属性

这个函数会返回一个调用该函数对象的外层函数引用.如果我们在函数B中调用函数A,那么只要在函数A中调用A.caller,结果就回得到函数B.

function A() {return A.caller;}
function B() {console.log(A());}
B();
image.png

当在全局作用域中调用函数A,将得到null
image.png

自定义属性

函数是一种特殊的对象,因此函数可以像对象一样拥有(或指定)属性。自定义属性的适用场景——静态变量。

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

你可能感兴趣的:(JavaScript学习笔记4_Function对象的属性和call/apply方法)