首页 > 语言 > JavaScript > 正文

javascript中call apply 与 bind方法详解

2024-05-06 15:00:20
字体:
来源:转载
供稿:网友

在JavaScript中,call、apply和bind是Function对象自带的三个方法,本文将通过几个场景的应用,来详细理解三个方法。

call()

call() 方法在使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。

当调用一个函数时,可以赋值一个不同的 this 对象。this 引用当前对象,即 call 方法的第一个参数。

通过 call 方法,你可以在一个对象上借用另一个对象上的方法,比如Object.prototype.toString.call([]),就是一个Array对象借用了Object对象上的方法。

语法 fun.call(thisArg[, arg1[, arg2[, ...]]])
thisArg
在fun函数运行时指定的this值。需要注意的是下面几种情况

(1)不传,或者传null,undefined, 函数中的this指向window对象
(2)传递另一个函数的函数名,函数中的this指向这个函数的引用,并不一定是该函数执行时真正的this值
(3)值为原始值(数字,字符串,布尔值)的this会指向该原始值的自动包装对象,如 String、Number、Boolean
(4)传递一个对象,函数中的this指向这个对象

arg1, arg2, ...
指定的参数列表。

例子
初级应用例子

function a(){ //输出函数a中的this对象 console.log(this); }//定义函数bfunction b(){} var obj = {name:'这是一个屌丝'}; //定义对象obja.call(); //windowa.call(null); //windowa.call(undefined);//windowa.call(1); //Numbera.call(''); //Stringa.call(true); //Booleana.call(b);// function b(){}a.call(obj); //Object

使用call方法调用匿名函数并且指定上下文的this

在下面的例子中,当调用 greet 方法的时候,该方法的 this 值会绑定到 i对象。

function greet() { var reply = [this.person, '是一个轻量的', this.role].join(' '); console.log(reply);}var i = {function greet() { var reply = [this.person, '是一个轻量的', this.role].join(' '); console.log(reply);}var i = { person: 'JSLite.io', role: 'Javascript 库。'};greet.call(i); // JSLite.io 是一个轻量的 Javascript 库。 person: 'JSLite.io', role: 'Javascript 库。'};greet.call(i); // JSLite.io 是一个轻量的 Javascript 库。

使用call方法调用匿名函数

在下例中的for循环体内,我们创建了一个匿名函数,然后通过调用该函数的call方法,将每个数组元素作为指定的this值执行了那个匿名函数。这个匿名函数的主要目的是给每个数组元素对象添加一个print方法,这个print方法可以打印出各元素在数组中的正确索引号。当然,这里不是必须得让数组元素作为this值传入那个匿名函数(普通参数就可以),目的是为了演示call的用法。

var animals = [ {species: 'Lion', name: 'King'}, {species: 'Whale', name: 'Fail'}];for (var i = 0; i < animals.length; i++) { (function (i) {  this.print = function () {  console.log('#' + i + ' ' + this.species + ': ' + this.name);  }  this.print(); }).call(animals[i], i);}//#0 Lion: King//#1 Whale: Fail            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表

图片精选