以太坊bindcallopts
『壹』 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的巧妙使用