js中当函数执行bind后再次执行bind或call时会怎样

var test = function(x,y){
    console.log(this,arguments)
}
var a=test.bind({s:1},1)
a.call({d:1},2) // {s: 1} 1 2
var b = a.bind({d:1},2)
b()// {s: 1} 1 2

var c = b.bind({e:3},3) 
c()

从上面的代码执行结果中我们发现一点,第一次bind绑定的对象是固定的,也就是后面通过bind或者call再次绑定的时候,就无法修改这个this了,从es5文档中我们能找到答案。

When the [[Call]] internal method of a function object, F, which was created using the bind function is called with a this value and a list of arguments ExtraArgs, the following steps are taken:

Let boundArgs be the value of F’s [[BoundArgs]] internal property.
Let boundThis be the value of F’s [[BoundThis]] internal property.
Let target be the value of F’s [[TargetFunction]] internal property.
Let args be a new list containing the same values as the list boundArgs in the same order followed by the same values as the list ExtraArgs in the same order.
Return the result of calling the [[Call]] internal method of target providing boundThis as the this value and providing args as the arguments.

这段话中说到如果我们在一个由bind创建的函数中调用call,假设是x.call(obj,y,z,…)并且传入this,和参数列表的时候会执行下面的步骤:
1.首先用三个参数分别保存函数x函数的内部属性中存的this值、目标函数和参数 列表。
2.然后执行目标函数的内部call函数,也就是执行目标函数的代码,并且传入1中保存的this和实参(这里的实参是目标函数本来就有的也就是bind时传入的实参加上调用call时传的实参)
重点在1中,从es5的bind函数说明中我们知道,当我们用一个函数调用bind的时候,返回的函数中会保存这三个参数。所以最后调用call的时候执行的函数是目标函数,也就是调用了bind的函数,传入的this也是bind调用时传入的,这些都是无法被修改的了,但是参数是调用bind和call时的叠加,这是我们唯一可以修改的地方。执行两次bind的原理可以参考bind的源码,和call的差不多,也是目标函数和this是被固定的了,只有参数列表会叠加。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: call、apply和bind都是JavaScript中的函数方法,它们都可以用来改变函数的this指向。 1. call方法:可以改变函数的this指向,并立即执行函数。它的第一个参数是要绑定给this的对象,后面的参数是传递给函数的参数列表。 2. apply方法:与call方法类似,也可以改变函数的this指向,但是它的第二个参数是一个数组,其中包含了传递给函数的参数列表。 3. bind方法:可以创建一个新的函数,并将原函数的this指向绑定到指定的对象上。它的第一个参数是要绑定给this的对象,后面的参数是传递给函数的参数列表。与call和apply不同的是,bind方法不会立即执行函数,而是返回一个新的函数,需要手动调用才能执行。 总之,这三个方法都可以用来改变函数的this指向,但是它们的使用场景略有不同。需要根据具体情况来选择使用哪个方法。 ### 回答2: 在JavaScript中,call、apply和bind都是用来改变函数执行的上下文的方法。这些方法都是函数的原型方法,可以在任何函数上使用。这些方法的作用是允许你指定函数中的“this”关键字应指向哪个对象。 call和apply的作用是在指定的上下文中调用函数,并且可以传递一个或多个参数。传递给call和apply的第一个参数都是要指定的上下文对象。接下来的参数都会被传递给函数。 call方法和apply方法很像,区别就是call方法接受一系列参数,而apply方法则接受一个数组作为它的第二个参数。 bind方法可以创建一个新的函数,新函数与原来的函数功能相同,只是它的执行上下文和参数已被预设。当你调用bind函数时,它会返回一个新的函数,这个函数的上下文和参数都会在调用bind时被设置。 综上所述,call,apply和bind都是用来改变函数执行的上下文的方法,它们都用于解决函数中“this”关键字的指向问题。call和apply比较适合使用在需要动态传递参数的情况下,而bind方法则比较适合在需要预设参数的情况下。理解了这些方法的用途和作用,便可以更加灵活地运用它们来编写更加优秀的代码。 ### 回答3: JavaScript中的call、apply、bind函数的三种不同调用方式。 1. call方法 call() 方法可以用来调用一个函数,并设置该函数内部的this关键字为传递给call() 方法的第一个参数。如果函数的第一个参数是null或undefined那么this关键字指向全局对象window。 除了第一个参数,它可以带任意多个参数,这些参数将按顺序传递给被调用函数。在ES6之前call方法是改变this上下文的第一种选择。 示例: function add(a, b) { return a + b; } const result = add.call(null, 2, 3); // 传递 null 到 a 中,参数 [2, 3] 将传递给 b console.log(result); // 5 2. apply方法 apply() 方法与 call() 方法的作用类似,它可以用来调用一个函数,并设置该函数内部的this关键字为传递给apply()方法的第一个参数,不同的是apply方法第二个参数是一个数组或类数组对象。 参数传递的方式同样是按顺序传递给被调用函数。 示例: function add(a, b) { return a + b; } const arr = [2, 3]; const result = add.apply(null, arr); // 传递 null 到 a 中,参数 [2, 3] 将传递给 b console.log(result); // 5 3. bind方法 bind() 方法也是用来改变函数内部的this关键字的,但是与call() 和 apply() 不同的是,它不会立即调用调用函数,而是返回一个新的函数,新函数的this被指定为bind()方法的第一个参数。bind方法返回的函数可以传递参数,在被调用函数时,这些参数会跟在传递给bind的参数后面传递。 示例: var person = { firstName: 'John', lastName: 'Doe', getFullName: function() { return this.firstName + ' ' + this.lastName; } } var getUserData = function(message, callback) { console.log(message + ": " + callback()); }; var boundFunct = person.getFullName.bind(person); getUserData('User name', boundFunct); // User name: John Doe 在开发中,可以根据具体的使用场景选择使用哪种方法。当需要立即调用函数并附加一些参数时,使用call() 或 apply()。当想先创建一个对象并在之后的某个时间点调用函数时,使用bind()。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值