当前位置:首页 » 以太坊知识 » 以太坊bindcallopts

以太坊bindcallopts

发布时间: 2021-05-22 21:00:38

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

从上面的代码执行结果中我们发现一点,第一次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是被固定的了,只有参数列表会叠加。

『贰』 js中call,apply和bind方法的区别和使用场景

在js中,所有的函数再被调用的时候都会默认传入两个参数,一个是this,还有一个是arguments。在默认情况下this都是指当前的调用函数的对象。但是有时候我们需要改变this的指向,也就是说使函数可以被其他对象来调用,那么我们应该怎样做呢?这时候我们就可以使用call,apply和bind方法了。
1.首先搞清楚call,apply和bind方法的来历
在js中所有的函数都是Function的实例,而且对于Function来说,它的原型即Function.prototype中含有很多东西,其中call,apply和bind方法就是Function原型中的方法,所以根据原型的规则,所有的函数都可以使用原型中属性和方法,所以来说,对于所有的函数都可以使用call,apply和bind方法。
简单一句话:call,apply和bind都是Function原型中的方法,而所有的函数都是Function的实例。

『叁』 请简述函数的bind和call的异同

jquery和jquery.easyui是不会自己去获取html对象的,需要你在需要时调用.另:请确定你获取的是option对象的值还是select对象的值,option对象的值是固定的(未使用js动态改变或赋值)。

『肆』 javascript中apply,call和bind的区别

1、每个函数都包含两个非继承而来的方法:apply()和call()。
apply()和call()的真正用武之地是能够扩充函数赖以运行的作用域,两者就是传的参数不一样
apply()接收两个参数,一个是函数运行的作用域(this),另一个是参数数组。call()方法第一个参数与apply()方法相同,但传递给函数的参数必须列举出来。举个栗子
function sum(num1, num2) {
return num1 + num2;
}
console.log(sum.call(window, 10, 10)); //20
console.log(sum.apply(window,[10,20])); //30
bind()和上面两个方法毛 关系都没有,它就是个绑定函数

『伍』 javascript中apply,call和bind的区别

1 call(), apply(),bind()都属于Function.prototype的一个内置方法,它是JavaScript引擎内在实现的,因为属于Function.prototype,主要就是围绕这this对象的改变操作。下面已代码逐一展示各自的用法。
2 var a = {
user:"call调用",
fn:function(){
console.log(this.user); //对应的user
}
}
var b = a.fn;
b.call(a);

意思是:call方法,给第一个参数添加要把b添加到哪个环境中,简单来说,this就会指向那个对象。
3 var a = {
user:"applay调用",
fn:function(){
console.log(this.user); // applay调用
}
}
var b = a.fn;
b.apply(a);
apply方法和call方法有些相似,它也可以改变this的指向;不同的是 ,但是不同的是,第二个参数必须是一个数组 如下代码
var a = {
user:"appy调用",
fn:function(e,ee){
console.log(this.user); // applay调用 第二个参数书数组
console.log(e+ee);
}
}
var b = a.fn;
b.apply(a,[10,1]);

4 上bind方法返回的是一个修改过后的函数
var a = {
user:"bind调用",
fn:function(){
console.log(this.user);
}
}
var b = a.fn;
b.bind(a);

『陆』 javascript中apply,call和bind的区别

apply与call

apply与call功能是一样的,不同的地方在于方法参数

//apply第二个参数是一个数组
func.apply(thisVal,[arg1,arg2,...]);
//call则从第二个参数开始为参数列表形式
func.call(thisVal,arg1,arg2,...);
//用一个例子来描述
//Math.max函数可以返回参数中的最大值
varmax1=Math.max(6,3,8,5);
//如果想找出数组中的最大,apply就派上用场了,因为Math.max不支持传入数组参数
//apply方法可以把数组中的最大值找出
vararray=[6,3,8,5];
varmax2=Math.max.apply(null,array);
//call方法与原来的方法比较类似,只是多了一个thisVal,
//因为max函数里没有用到this,所以这里的thisVal可以传任意值
varmax3=Math.max.call(null,6,3,8,5);

bind

1. apply与call调用会直接返回函数的执行结果, 而bind则返回一个函数

2. 该函数需求传入参数是原函数参数减去bind传的参数(不考虑thisVal的话)

//语法
func.bind(thisVal,arg1,arg2,...);
//示例
functionfunc(a,b,c)
{
console.log(a,b,c);
}
vara=1,b=2,c=3;
varbindFunc=func.bind(null,a);//func没有用到this,所以thisVal可以传null
bindFunc(b,c);//注意这里这需要传b和c就可以了
//Math.max使用bind
varmaxFunc=Math.max.bind(null,6,3);
varmax4=maxFunc(8,5);

『柒』 javascript中apply,call和bind的区别

javascript中apply、call和bind的区别

在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢。
在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。
那么他们的区别在哪里的,先看一个例子。

var xw = {
name : "小王",
gender : "男",
age : 24,
say : function() {
alert(this.name + " , " + this.gender + " ,今年" + this.age);
}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}
xw.say();
复制代码

本身没什么好说的,显示的肯定是小王 , 男 , 今年24。
那么如何用xw的say方法来显示xh的数据呢。
对于call可以这样:

xw.say.call(xh);
复制代码

对于apply可以这样:

xw.say.apply(xh);
复制代码

而对于bind来说需要这样:

xw.say.bind(xh)();
复制代码

如果直接写xw.say.bind(xh)是不会有任何结果的,看到区别了吗?call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
那么call和apply有什么区别呢?我们把例子稍微改写一下。

var xw = {
name : "小王",
gender : "男",
age : 24,
say : function(school,grade) {
alert(this.name + " , " +
this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);

}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}
复制代码

可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
对于call来说是这样的

xw.say.call(xh,"实验小学","六年级");
复制代码

而对于apply来说是这样的

xw.say.apply(xh,["实验小学","六年级郑州牛皮癣医院"]);
复制代码

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它可以像call那样传参。

xw.say.bind(xh,"实验小学","六年级")();
复制代码

但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

xw.say.bind(xh)("实验小学","六年级");

『捌』 javascript中apply,call和bind的区别

在javascript中,这三种方法都是用来改变函数的this对象的指向的。

相似点:

都是用来改变函数的this对象的指向的

第一个参数都是this要指向的对象

都可以继续传递参数

区别:

call和apply方法,都是对函数的直接调用,但是bind()方法需要加上()来执行。

varxb={
name:'小冰',
gender:'女',
say:function(){
alert(this.name+','+this.gender);
}
}varother={
name:'小东',
gender:'男',
}
xb.say();===>结果小冰,女

简单的可以用:

1.xb.say.call(other);
2.xb.say.apply(other);
3.xb.say.bind(other)();

传参数的情况:

varxb={
name:'小冰',
gender:'女',
say:function(school,grade){
alert(this.name+','+this.gender+'----'+school+','+grade);
}
}varother={
name:'小东',
gender:'男',
}

用call()传参调用:

xb.say.call(other,'斯坦福','3')
//====>小东,男----斯坦福,3

用apply()传参调用:

xb.say.apply(other,['sitanfu','third']);
//====>小东,男----sitanfu,third

call()和apply()函数的用法其实是一样的,只是传参的形式不一样。

用bind()传参调用:

xb.say.bind(other,'斯坦福','3');
//是不是跟call传参很像

但是上面xb.say.bind(other,’斯坦福’,’3’),返回的其实还是一个函数,并没有执行。

console.log(xb.say.bind(other));
//可以把xb.say.bind(other);打印出来看看
//===>返回的是一个函数返回放在下一节代码里面
}

返回结果:

function(school,grade){
alert(this.name+','+this.gender+'----'+school+','+grade);12

所以要执行,需要在xb.say.bind(other)后面加()让其执行。执行结果如下:

console.log(xb.say.bind(other))('斯坦福','3');
//==>小东,男---斯坦福,3

附加bind的源码实现:

//the.bindmethodfromprototype.js
Function.prototype.bind=function(){
varfn=this,args=Array.prototype.slice.call(arguments),object=args.shift();
returnfunction(){
returnfn.apply(object,args.concat(Array.prototype.slice.call(arguments)));
}
}

『玖』 javascript中apply,call和bind的区别

call(thisObj,arg1,arg2...)、apply(thisObj,[obj1,obj2...])这二个方法是每个函数都包含的非继承的方法

call(thisobj[, args])和apply(thisobj[, args])

作用都是一样的,简单来说就是改变当前使用该方法的对象中的this指向,指向调用方法中的thisObj对象二者的区别(第一个参数是相同的)就是call方法中传入的参数是是一个个列举出来的,而apply方法中的参数二是一个数组

还是举例说明比较直观:
?

1
2
3
4
5
6
7
8
9
10

window.color='red';
var o={color:"blue"};
function sayColor(){
alert(this.color);
};
sayColor(); //red(全局函数,this是window)
sayColor.call(this);//red(调用call方法,指定对象是this,这里的this是window,没什么意义)
sayColor.call(window);//red(调用call方法,指定对象是window,没什么意义)
sayColor.call(o); //blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)
sayColor.apply(o);//blue (调用call方法,指定对象是o,所以this指代对象o,这里由原来的window指向了o)

ECMAScript5中的bind()方法和前二种方法相似,bind()这个方法会创建一个函数的实例,这个实例的this值会被绑定到传递给bind()函数的值
例子:

?

1
2
3
4
5
6

function a(y){
return this.x+y;
};
var o={x:1};
var g=a.bind(o);
g(2);//3

从例子中可以看出函数a绑定到对象o上了,并且返回了新的函数g,调用g时,a函数会当作对象o的方法来调用
bind()这个方法是将函数绑定到某个对象上,并且返回一个新的函数,这个新函数中传入的参数都将传入被绑定的函数上。
下面来看看他们的区别
在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢。
在说区别之前还是先总结一下三者的相似之处:
1、都是用来改变函数的this对象的指向的。
2、第一个参数都是this要指向的对象。
3、都可以利用后续参数传参。
那么他们的区别在哪里的,先看一个例子。
var xw = {
name : "小王",
gender : "男",
age : 24,
say : function() {
alert(this.name + " , " + this.gender + " ,今年" + this.age);
}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}
xw.say();
本身没什么好说的,显示的肯定是小王 , 男 , 今年24。
那么如何用xw的say方法来显示xh的数据呢。
对于call可以这样:

复制代码代码如下:

xw.say.call(xh);

对于apply可以这样:

复制代码代码如下:

xw.say.apply(xh);

而对于bind来说需要这样:

复制代码代码如下:

xw.say.bind(xh)();

如果直接写xw.say.bind(xh)是不会有任何结果的,看到区别了吗?call和apply都是对函数的直接调用,而bind方法返回的仍然是一个函数,因此后面还需要()来进行调用才可以。
那么call和apply有什么区别呢?我们把例子稍微改写一下。

?

1
2
3
4
5
6
7
8
9
10
11
12
13

var xw = {
name : "小王",
gender : "男",
age : 24,
say : function(school,grade) {
alert(this.name + " , " + this.gender + " ,今年" + this.age + " ,在" + school + "上" + grade);
}
}
var xh = {
name : "小红",
gender : "女",
age : 18
}

可以看到say方法多了两个参数,我们通过call/apply的参数进行传参。
对于call来说是这样的

复制代码代码如下:

xw.say.call(xh,"实验小学","六年级");

而对于apply来说是这样的

复制代码代码如下:

xw.say.apply(xh,["实验小学","六年级郑州牛皮癣医院"]);

看到区别了吗,call后面的参数与say方法中是一一对应的,而apply的第二个参数是一个数组,数组中的元素是和say方法中一一对应的,这就是两者最大的区别。
那么bind怎么传参呢?它可以像call那样传参。

复制代码代码如下:

xw.say.bind(xh,"实验小学","六年级")();

但是由于bind返回的仍然是一个函数,所以我们还可以在调用的时候再进行传参。

复制代码代码如下:

xw.say.bind(xh)("实验小学","六年级");

以上所述就是本文的全部内容了,希望大家能够喜欢、
您可能感兴趣的文章:
全面解析JavaScript中apply和call以及bind(推荐)
关于JS中的apply,call,bind的深入解析
JS中改变this指向的方法(call和apply、bind)
浅谈javascript的call()、apply()、bind()的用法
跟我学习javascript的call(),apply(),bind()与回调
开启Javascript中apply、call、bind的用法之旅模式
javascript中call,apply,bind的用法对比分析
js apply/call/caller/callee/bind使用方法与区别分析
Javascript中apply、call、bind的巧妙使用

热点内容
一btc多少人民币 发布:2024-11-17 19:30:26 浏览:382
区块云super挖矿 发布:2024-11-17 19:30:25 浏览:869
usdt怎么那么便宜 发布:2024-11-17 19:23:18 浏览:436
以太坊卖成usdt委托操作 发布:2024-11-17 19:19:48 浏览:299
币圈k线图怎么看涨跌前景 发布:2024-11-17 19:10:16 浏览:520
比特币怎么变成美金 发布:2024-11-17 18:57:56 浏览:274
ambc挖矿能赚usdt吗 发布:2024-11-17 18:47:40 浏览:935
转xrp要填写tag 发布:2024-11-17 18:41:43 浏览:857
如何将区块链应用到工业40中 发布:2024-11-17 18:41:02 浏览:317
区块链科技入股 发布:2024-11-17 18:28:23 浏览:210