Function 对象属性和方法

Function对象属性

1、arguments(此api或已弃用,但仍能使用)

  • arguments.length:获取函数实参的个数
  • arguments.callee:获取函数对象本身的引用
  • arguments.callee.length:获取函数形参的个数

Javascrip中每个函数都会有一个Arguments对象实例arguments,它引用着函数的实参,可以用数组下标的方式"[]"引用每个实际传入的参数。

示例:

function test (a,b,c,d) {
    console.log('len(实参个数):',arguments.length) // len(实参个数): 3
    console.log('callee(函数本身):',arguments.callee) // callee(函数本身): ƒ test (a,b,c,d) {...}
    console.log('callee.length(形参个数):',arguments.callee.length) // callee.length(形参个数): 4
    console.log('指定参数:',arguments[0],arguments[1],arguments[arguments.length - 1])// 指定参数: hello (3) [1, 2, 3] {a: 999}
} 
test('hello',[1,2,3],{a:999})

 

2.length :获取函数的接收参数(形参)个数。

function test (a,b,c,d,e,f,g) {
    console.log('len:',test.length) // len: 7
}
test()

 

 

Function对象方法

1、call() : 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

语法:function.call(thisArg, arg1, arg2, ...)
参数:

  • thisArg(可选):
    • 在 function 函数运行时使用的 this 值。
    • this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。
  • arg1, arg2, ...:
    • 指定的参数列表。

返回值:使用调用者提供的 this 值和参数调用该函数的返回值。若该方法没有返回值,则返回 undefined。

示例:

// call 的基本用法:fn.call第一个参数指向o,所以前三个参数this.a、this.b、this.c分别对应o的a、b、c,
// fn.call的第二部分参数(除第一个参数以外的参数)分别是fn函数原本的参数,对应d、e、f
var o = {a:1,b:2,c:3}
function fn(d,e,f) {
    console.log(this.a,this.b,this.c,d,e,f)
}
fn.call(o,3,4,5) // 1 2 3 3 4 5


// 在子构造函数中,可以通过调用父构造函数的 call方法来实现继承。示例中,使用 Singer和 Writer 构造函数创建的对象实例都会拥有在 Person构造函数定义的 name属性 和 age属性,但 skill属性 是在各自的构造函数中定义的。
function Person(name, age) {
  this.name = name;
  this.age = age;
}

function Singer(name, age) {
  Person.call(this, name, age);
  this.skill = 'sing';
}

function Writer(name, age) {
  Person.call(this, name, age);
  this.skill = 'writing';
}

var ZXY = new Singer('学友', 20);
var LX = new Writer('树人', 30);

 

2、apply() : 调用一个具有给定this值的函数,以及作为一个数组(或类似数组对象)提供的参数。

语法:function.apply(thisArg, [argsArray])
参数:

  • thisArg(必选):
    • 在 function 函数运行时使用的 this 值。
    • this可能不是该方法看到的实际值:如果这个函数处于非严格模式下,则指定为 null 或 undefined 时会自动替换为指向全局对象,原始值会被包装。
  • argsArray :
    • 一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 function 函数。
    • 如果该参数的值为 null 或  undefined,则表示不需要传入任何参数。

返回值:调用有指定this值和参数的函数的结果。

示例:

// apply的基本用法与 call一样,不同在第二部分参数:
// fn.apply 第一个参数指向o,所以前三个参数this.a、this.b、this.c分别对应o的a、b、c,
// fn.apply 的第二部分参数(除第一个参数以外的参数)是一个数组或类数组对象,数组里面每个元素分别对应fn函数原本的参数,示例中3,4,5分别对应d、e、f
var o = {a:1,b:2,c:3}
function fn(d,e,f) {
    console.log(this.a,this.b,this.c,d,e,f)
}
var args = [3,4,5]
fn.apply(o,args) // 1 2 3 3 4 5

// 合并数组
var array = ['a', 'b'];
var elements = [0, 1, 2];
array.push.apply(array, elements);
console.info(array); // ["a", "b", 0, 1, 2]

 

 

3、bind() : 创建一个新的函数,在 bind() 被调用时,这个新函数的 this 被指定为 bind() 的第一个参数,而其余参数将作为新函数的参数,供调用时使用。

语法:function.bind(thisArg[, arg1[, arg2[, ...]]])
参数:

  • thisArg:
    • 调用绑定函数时作为 this 参数传递给目标函数的值。
    • 如果使用new运算符构造绑定函数,则忽略该值。
    • 当使用 bind 在 setTimeout 中创建一个函数(作为回调提供)时,作为 thisArg 传递的任何原始值都将转换为 object。
    • 如果 bind 函数的参数列表为空,或者thisArg是null或undefined,执行作用域的 this 将被视为新函数的 thisArg。
  • arg1, arg2, ...:
    • 当目标函数被调用时,被预置入绑定函数的参数列表中的参数。

返回值:返回一个原函数的拷贝,并拥有指定的 this 值和初始参数。

示例:

// bind 的基本用法:fn.bind第一个参数指向o,所以前三个参数this.a、this.b、this.c分别对应o的a、b、c,
// fn.bind的第二部分参数(除第一个参数以外的参数)分别是fn函数原本的参数,对应d、e、f
// 需要注意的是bind返回一个未立即执行的函数,需要接收调用
var o = {a:1,b:2,c:3}
function fn(d,e,f) {
    console.log(this.a,this.b,this.c,d,e,f)
}
var nfn = fn.bind(o,3,4,5); // nfn接收返回的函数
nfn() // 1 2 3 3 4 5

 

 

call() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。

上一篇:JS之this


下一篇:js函数调用模式