java apply_JavaScirpt之apply&call和bind

一.call()和 apply()概念和区别

1.概念

在 javascript 中,call 和 apply 都是为了改变某个函数运行时的上下文(context)而存在的,换句话说,就是为了改变函数体内部 this 的指向。

2.区别

call()和 apply()唯一区别在于传参数,apply()接收两个参数,一个是在其运行函数中的作用域,另外一个是参数数组其中,第二参数可以是 Array 的实例,也可以是 arguments 对象,call()第一个参数和 apply()一样,第二个参数必须逐个列举出来,通过代码展示

function sum(num1, num2) {

return num1 + num2;

}

function applySum(num1, num2) {

console.log(arguments);

//此时this对象是全局window对象

return sum.apply(this, arguments);

// 或者

return sum.apply(this, [num1, num2]);

}

console.log(applySum(1, 2));

/**

call()和apply()发放唯一区别在于传参数.call()传参数必须逐个列举出来

*/

function callSum(num1, num2) {

console.log(...arguments);

//此时this对象是全局window对象

return sum.call(this, num1, num2);

// 或者使用ES6的语法

return sum.call(this, ...arguments);

}

console.log(callSum(1, 2));

3.传递参数并非 apply 和 call 的真正的用武之地,他们真正强大的地方是能够扩充函数赖以运行的作用域

var o = {

name: "kebi"

};

window.name = "heyushuo";

function sayName() {

console.log(this.name);

}

sayName.call(this); //heyushuo

sayName.call(window); //heyushuo

sayName.call(o); //kebi 此时函数的执行环境不一样了,因为此时函数体内的this对象指向了o,于是结果显示的是'kebi'

//call和apply来扩充作用域的最大好处就是对象不需要与方法有任何耦合关系,

4.apply 和 call 的一些骚操作

//1.数组合并

var arr1 = [1, 2, 3];

var arr2 = ["heyushuo", "kebi"];

//arr1改变数组的作用域,arr2传的参数

Array.prototype.push.apply(arr1, arr2); //[1,2,3,'heyushuo','kebi']

//或者

arr1.concat(arr2)

// 或者ES6的语法

[...arr1, ...arr2];

//2.数组中的最大值

Math.max.apply(Math,arr1);

//或者es6的语法

Math.max(...arr1);

//3.判断对象的数据类型

//在最原始的对象中进行,不能直接arr1.toString() 或者 o.tosString() 因为对象和数组已经把原始对象的toString()方法进行了修改

Object.prototype.toString.call(arr1); // [object Array]

Object.prototype.toString.call(o)); //[object Object]

//4.可以把伪数组变成真正的数组,例如 arguments / document.getElementsByTagName("span")

Array.prototype.slice.call(document.getElementsByTagName("span"), 0))

//或者使用es6的语法

[...document.getElementsByTagName("span")]

二.bind()方法,ES5 提供了另外一个方法

解释: bind()和 call,apply 的作用是一样的,bind()这个方法会创建一个函数的实例,该方法可传入两个参数,第一个参数作为 this,第二个及以后的参数则作为函数的参数调用,这个方法和 call,apply 最重要的区别是,绑定 bind()后会创建一个新的函数,并且不会自动执行,需要调用执行

//通过这个例子看一下三者的区别

var o = {

name: "kebi"

};

window.name = "heyushuo";

function sayName() {

console.log(this.name);

}

sayName.call(window); //heyushuo

sayName.call(o); //kebi

sayName.apply(window); //heyushuo

sayName.apply(o); //kebi

//这是bind的用法

var objName = sayName.bind(o); //ie9+

objName(); //kebi

三.总结

apply,call,bind 三者都是用来改变函数的 this 对象的指向的;

apply,call,bind 三者都可以利用后续参数传参;

bind 是返回对应函数,便于稍后调用;apply,call 则是立即调用;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值