js中Function对象--call、apply和bind

Function对象–call、apply和bind

这三个对象的作用是更改函数内的this的指向
例如:

function f1(a,b){
	console.log(a + b);
}
f1(1,2); //3
f1.call(null,1,2); //3
f1.apply(null,[1,2]);//3
function f2(a,b){
	console.log(a + b);
}·
f2.call(obj,1,2);
//这个时候里面的this的指向已经不是window了已经换为了obj

然而call和apply的区别就是apply必须放在数组内。
如果函数没形参的话call和apply的第可以不传参,this默认为window如果传null的话也是默认为window;
如果有参数的话则第一个必须传参数而且必须是一个对象或者传null,否则会报错或者出现NAN

call和apply的实际作用是什么呢?

1.方法借用
2.js中继承

1.)方法借用
//求最大数
Math.max(1,2,3,55,77)//77
Math.max([1,2,3,55,77])//报错

Math.max.apply(null,[1,2,3,55,77]);//77
//等同于
var arr = [1,2,3,55,77];
Math.max.apply(null,arr);//77


//2.把伪数组转化为数组
var wsz = {0,"123",1,"asd",2,"123",length:3};
var arr = [].slice.call(wsz);
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: bind、call和apply都是用来改变函数this的指向的方法。 bind方法会返回一个新的函数,这个新函数的this指向被绑定的对象,但不会立即执行。 call和apply方法都是立即执行函数,并且都会改变函数this的指向。它们的区别在于传入参数的方式不同,call方法是将参数一个一个传入,而apply方法是将参数放在一个数组传入。 举个例子: ``` var obj = { name: 'Tom' }; function sayHello(age) { console.log('Hello, my name is ' + this.name + ', I am ' + age + ' years old.'); } var newSayHello = sayHello.bind(obj); newSayHello(18); // Hello, my name is Tom, I am 18 years old. sayHello.call(obj, 18); // Hello, my name is Tom, I am 18 years old. sayHello.apply(obj, [18]); // Hello, my name is Tom, I am 18 years old. ``` 以上代码,我们定义了一个对象obj和一个函数sayHello。使用bind方法将sayHello函数的this指向obj,并返回一个新的函数newSayHello。使用call和apply方法直接调用sayHello函数,并将this指向obj,同时传入参数18。 ### 回答2: bind和call apply都是JavaScript用来改变函数执行上下文的方法,但它们有些许区别。 bind方法会创建一个新函数,其this值会被绑定到指定的对象上。它接收一个参数,即想要将函数绑定到的对象。如果绑定的函数参数存在,则会将绑定函数的参数传递给原始函数,同时返回绑定后的新函数。如果绑定的函数没有参数,则直接返回一个绑定后的新函数。bind方法并不会立即调用函数,而是返回一个函数引用,需要手动调用函数才会执行。 call和apply则是直接调用函数,并且可以指定函数执行上下文。它们最主要的区别在于传递参数的方式不同。call方法接收的参数是一个参数列表,即需要传递给函数的参数直接列出来一个一个传递。apply方法接收的参数是一个数组,即需要传递给函数的参数通过数组的方式传递。另外,如果函数没有参数,那么使用call和apply的方式没有区别。 因此,如果我们想要在不同的上下文调用函数,可以使用bind方法,在其他时候可以使用call和apply方法。同时,由于bind方法会创建新的函数引用,可能会占用一些内存空间,因此可考虑使用call和apply方法。 ### 回答3: bind、call和apply是JavaScript三个非常重要的函数方法,它们都用于改变函数的this指向。虽然它们的作用类似,但是它们具体的使用方式有很大的不同。 bind()、call()和apply()都能够把一个函数的this指向指定为第一个参数对象,并且都可以传递多个参数给函数。具体差别如下: 1. bind():bind()方法常常用于多次调用同一函数,且该函数的this值不变。bind()方法会返回一个新函数,并且它的this值总是被指定为第一个参数。bind()方法的传参方式,与原函数相同,在调用时将参数以一个个单独的参数传入。 2. call():将具体的值,作为指定的this,传入并执行该函数。call()方法会在调用时执行指定函数,并且呈现出函数的this值为第一个参数的对象。call()方法的传参方式,将参数以一个个单独的参数传入。 3. apply():apply()的作用与call()类似,主要区别在于参数的传递方式,apply()会将参数直接传入数组。就是说,在调用apply()方法时,需要将需要绑定到this的对象作为第一个参数传入,第二个参数是一个数组、列表或类似数组的对象,该数组的所有元素都将作为单独的参数传递给被调用的函数。 总之,bind()、call()和apply()都是用于改变函数的this指向,它们之间的区别主要在于传递参数的方式不同。在实际开发,我们需要根据场景的需要选择不同的方法来使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值