call() 、 apply() 、bind() 、箭头函数

本文深入解析JavaScript中的Function对象的apply、call和bind方法的使用及区别,同时介绍了箭头函数的特性与应用场景,帮助读者理解如何在参数不确定的情况下使用这些方法,以及如何利用箭头函数简化代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每一个Function对象都有一个apply()方法和一个call()方法

apply:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.apply(A, arguments);即A对象应用B对象的方法。arguments为b的参数.a为对象
call:调用一个对象的一个方法,用另一个对象替换当前对象。例如:B.call(A, args1,args2);即A对象调用B对象的方法
bind() 就是将某个函数绑定到某个对象上。

它们的共同之处:
都“可以用来代替另一个对象调用一个方法,将一个函数的对象上下文从初始的上下文改变为由thisObj指定的新对象”。

不同:第一个参数相同,就是指定的对象
call()在第一个参数之后的 后续所有参数就是传入该函数的值
apply()只有2个参数,第二个参数为数组,必须保证参数的有有效性,不能少.

参数不确定时候,利用apply,acll 完成,定义一个方法,让他可以代理某一个方法.

function log(){
  console.log.apply(console, arguments);
};
log(1);    //1
log(1,2);    //1 2

//利用arguments 通过 Array.prototype.slice.call 转化为标准数组,再使用数组方法unshift,

function log(){
  var args = Array.prototype.slice.call(arguments);
  args.unshift('(app)');
 
  console.log.apply(console, args);
};

bind()的另一个最简单的用法是使一个函数拥有预设的初始参数。

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

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

// 预定义参数37
var leadingThirtysevenList = list.bind(undefined, 37);

var list2 = leadingThirtysevenList(); // [37]
var list3 = leadingThirtysevenList(1, 2, 3); // [37, 1, 2, 3]

bind()也可以为需要特定this值的函数创造捷径。

将一个类数组对象转换为真正的数组

var unboundSlice = Array.prototype.slice;
var slice = Function.prototype.call.bind(unboundSlice);

// ...

slice(arguments);

在Javascript中,多次 bind() 是无效的。

bind() 方法的,他后面多了对括号。

console.log(foo.getX.bind(obj)());  //81
console.log(foo.getX.call(obj));    //81
console.log(foo.getX.apply(obj));   //81

也就是说,区别是,当你希望改变上下文环境之后并非立即执行,而是回调执行的时候,使用 bind() 方法。而 apply/call 则会立即执行函数。

箭头函数

语法比函数表达式更简洁,并且没有自己的this,arguments,super或 new.target。

  • 使用剩余参数是相较使用arguments对象的更好选择。
function foo(arg) { 
      var f = (...args) => args[0]; 
      return f(arg); 
    }
    foo(1); // 1
    function foo(arg1,arg2) { 
        var f = (...args) => args[1]; 
        return f(arg1,arg2); 
    } 
    foo(1,2);  //2
  • 箭头函数不能用作构造器,和 new一起用会抛出错误。
  • 由于 箭头函数没有自己的this指针,通过 call() 或 apply() 方法调用一个函数时,只能传递参数(不能绑定this)
  • 箭头函数没有prototype属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值