函数原型对象方法

Function.prototyp.apply()

apply() 函数用于调用当前函数,并可同时使用指定对象作为本次函数执行时函数内部的 this 指针引用。

语法

func.apply( [thisArg [, argsArray]])

参数

参数 类型 描述
func Function 类型 当前函数调用 apply() 函数的函数,通常为 this (函数内部执行)。
thisArg 可选,Object 类型 执行函数时,函数内部 this 指针引用的对象。需要注意的是,使用的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 nullundefined 时会自动替换为指向全局对象(浏览器中就是 Window 对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的包装对象。
argsArray 可选,Array 类型或 TypedArray 类型 一个数组或者类数组对象,其中的数组元素将作为单独的参数传给 func 函数。如果该参数的值 为nullundefined,则表示不需要传入任何参数。从 ECMAScript 5 开始可以使用类数组对象。

示例

基本用法

const a = {
    name: 'Cherry',

    func1: function(){
		console.log(this.name)
	}

	func2: function(){
		setTimeout(function(){
			this.func1()
		}.apply(a), 100)
	}
}

a.func2()		// Cherry

Function.prototype.call()

call() 函数用于调用当前函数,并可同时使用指定对象作为本次执行时函数内部的 this 指针引用。

语法

func.call( [thisArg [, arg1 [, arg2 [, argN...]]]] )

参数

参数 类型 描述
func Function 类型 当前函数调用 call() 函数的函数,通常为 this (函数内部执行)。
thisArg 可选,Object 类型 fun函数运行时指定的 this 值*。*需要注意的是,指定的 this 值并不一定是该函数执行时真正的 this 值,如果这个函数处于非严格模式下,则指定为 nullundefinedthis 值会自动指向全局对象(浏览器中就是 Window 对象),同时值为原始值(数字,字符串,布尔值)的 this 会指向该原始值的自动包装对象。
arg1,arg2,argN 可选,Array 类型或 TypedArray 类型 指定的参数列表。

示例

const sayName = function () {
  console.log(this.name);
};

const peter = {
  name: 'peter',
};

sayName.call(peter); // peter
function Person1() {
  this.name = 'person1';
  this.sayName = function () {
    alert(this.name);
  };
}

function Person2() {
  this.name = 'person2';
}

var sam = new Person2();

Person1.call(sam);

sam.sayName(); // person1

Function.prototype.bind()

bind() 方法创建一个新的函数, 当被调用时,将其 this 关键字设置为提供的值,在调用新函数时,在任何提供之前提供一个给定的参数序列。

语法

func.bind( thisArg [, arg1 [, arg2 [, ...]]] )

参数

参数 类型 描述
func Function 类型
thisArg 可选,Object 类型 当绑定函数被调用时,该参数会作为原函数运行时的 this 指向。当使用 new 操作符调用绑定函数时,该参数无效。
arg1,arg2,argN 可选,Array 类型或 TypedArray 类型 当绑定函数被调用时,这些参数将置于实参之前传递给被绑定的方法。

描述

bind() 函数会创建一个新函数(称为绑定函数),新函数与被调函数(绑定函数的目标函数)具有相同的函数体(在 ECMAScript 5 规范中内置的 call 属性)。当新函数被调用时 this 值绑定到 bind() 的第一个参数,该参数不能被重写。绑定函数被调用时,bind() 也接受预设的参数提供给原函数。一个绑定函数也能使用 new 操作符创建对象:这种行为就像把原函数当成构造器。提供的 this 值被忽略,同时调用时的参数被提供给模拟函数。

示例

代码示例

bind() 最简单的用法是创建一个函数,使这个函数不论怎么调用都有同样的 this 值。JavaScript 新手经常犯的一个错误是将一个方法从对象中拿出来,然后再调用,希望方法中的 this 是原来的对象(比如在回调中传入这个方法)。如果不做特殊处理的话,一般会丢失原来的对象。从原来的函数和原来的对象创建一个绑定函数,则能很漂亮地解决这个问题。

this.x = 9;

var module = {
  x: 8,
  getX: function () {
    return this.x;
  },
};

module.getX(); // return 8

var retrieveX = module.getX;
retrieveX(); // return 9

var boundGetX = retrieveX.bind(module);
boundGetX(); // return 8

偏函数

bind() 的另一个最简单的用法是使一个函数拥有预设的初始参数。这些参数(如果有的话)作为 bind() 的第二个参数跟在 this(或其他对象)后面,之后它们会被插入到目标函数的参数列表的开始位置,传递给绑定函数的参数会跟在它们的后面。

function list() {
  return Array.prototype.slice.call(arguments);
}

var list1 = list(1, 2, 3); // [1, 2, 3]

// Create a function with a preset leading argument
var defaultsList = list.bind(undefined, 10);

var list2 = defaultsList(); // [10]
var list3 = defaultsList(1, 2, 3); // [10, 1, 2, 3]

配合定时器

在默认情况下,使用 window.setTimeout() 时,this 关键字会指向 window (或全局)对象。当使用类的方法时,需要 this 引用类的实例,你可能需要显式地把 this 绑定到回调函数以便继续使用实例。

function LateBloomer() {
  this.petalCount = Math.ceil(Math.random() * 12) + 1;
}

// Declare bloom after a delay of 1 second
LateBloomer.prototype.bloom = function () {
  window.setTimeout(this.declare.bind(this), 1000);
};

LateBloomer.prototype.declare = function () {
  console.log('I am a beautiful flower with ' + this.petalCount + ' petals!');
};

var flower = new LateBloomer();
flower.bloom(); // 一秒钟后, 调用'declare'方法