亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

call與apply在JavaScript中的作用是什么

發布時間:2021-01-06 17:09:11 來源:億速云 閱讀:318 作者:Leah 欄目:web開發

這篇文章給大家介紹call與apply在JavaScript中的作用是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

apply 接受兩個參數,第一個參數指定了函數體內this 對象的指向,第二個參數為一個帶下標的集合,這個集合可以為數組,也可以為類數組,apply 方法把這個集合中的元素作為參數傳遞給被調用的函數:

var func = function( a, b, c ){
  alert ( [ a, b, c ] ); // 輸出 [ 1, 2, 3 ]
};
func.apply( null, [ 1, 2, 3 ] );

在這段代碼中,參數 1、2、3 被放在數組中一起傳入func函數,它們分別對應func參數列表中的a、b、c。

call 傳入的參數數量不固定,跟apply 相同的是,第一個參數也是代表函數體內的this 指向,從第二個參數開始往后,每個參數被依次傳入函數:

var func = function( a, b, c ){
  alert ( [ a, b, c ] ); // 輸出 [ 1, 2, 3 ]
};
func.call( null, 1, 2, 3 );

當調用一個函數時,JavaScript 的解釋器并不會計較形參和實參在數量、類型以及順序上的區別,JavaScript 的參數在內部就是用一個數組來表示的。從這個意義上說,apply比call的使用率更高,我們不必關心具體有多少參數被傳入函數,只要用apply 一股腦地推過去就可以了。call是包裝在apply上面的一顆語法糖,如果我們明確地知道函數接受多少個參數,而且想一目了然地表達形參和實參的對應關系,那么也可以用call 來傳送參數。

call和apply的用途

1. 改變this 指向

call 和apply 最常見的用途是改變函數內部的this 指向,我們來看個例子:

var obj1 = {
  name: 'sven'
};
var obj2 = {
  name: 'anne'
};
window.name = 'window';
var getName = function(){
  alert ( this.name );
};
getName(); // 輸出: window
getName.call( obj1 ); // 輸出: sven
getName.call( obj2 ); // 輸出: anne

當執行getName.call( obj1 )這句代碼時,getName 函數體內的this 就指向obj1 對象,所以此處的

var getName = function(){
alert ( this.name );
};

實際上相當于:

var getName = function(){
alert ( obj1.name ); // 輸出: sven
};

在實際開發中,經常會遇到this指向被不經意改變的場景,比如有一個div節點,div節點的onclick 事件中的this 本來是指向這個div的:

document.getElementById( 'div1' ).onclick = function(){
  alert( this.id ); // 輸出:div1
};

假如該事件函數中有一個內部函數func,在事件內部調用func 函數時,func 函數體內的this就指向了window,而不是我們預期的div,見如下代碼:

document.getElementById( 'div1' ).onclick = function(){
  alert( this.id ); // 輸出:div1
  var func = function(){
    alert ( this.id ); // 輸出:undefined
  }
  func();
};

這時候我們用call 來修正func 函數內的this,使其依然指向div:

document.getElementById( 'div1' ).onclick = function(){
  var func = function(){
    alert ( this.id ); // 輸出:div1
  }
  func.call( this );
};

2. Function.prototype.bind

大部分高級瀏覽器都實現了內置的Function.prototype.bind,用來指定函數內部的this 指向,即使沒有原生的Function.prototype.bind 實現,我們來模擬一個也不是難事,代碼如下:

Function.prototype.bind = function( context ){
var self = this; // 保存原函數
return function(){ // 返回一個新的函數
    return self.apply( context, arguments ); // 執行新的函數的時候,會   把之前傳入的context
  // 當作新函數體內的this
  }
};
var obj = {
  name: 'sven'
};
var func = function(){
  alert ( this.name ); // 輸出:sven
}.bind( obj);
func();

我們通過Function.prototype.bind 來“包裝”func 函數,并且傳入一個對象context 當作參數,這個context 對象就是我們想修正的this 對象。

在Function.prototype.bind 的內部實現中,我們先把func 函數的引用保存起來,然后返回一個新的函數。當我們在將來執行func 函數時,實際上先執行的是這個剛剛返回的新函數。在新函數內部,self.apply( context, arguments )這句代碼才是執行原來的func 函數,并且指定context對象為func 函數體內的this。

這是一個簡化版的Function.prototype.bind 實現,通常我們還會把它實現得稍微復雜一點,

使得可以往func 函數中預先填入一些參數:

Function.prototype.bind = function(){
  var self = this, // 保存原函數
  context = [].shift.call( arguments ), // 需要綁定的this 上下文
  args = [].slice.call( arguments ); // 剩余的參數轉成數組
  return function(){ // 返回一個新的函數
    return self.apply( context, [].concat.call( args, [].slice.call(  arguments ) ) );
    // 執行新的函數的時候,會把之前傳入的context 當作新函數體內的this
    // 并且組合兩次分別傳入的參數,作為新函數的參數
  }
};
var obj = {
  name: 'sven'
};
var func = function( a, b, c, d ){
  alert ( this.name ); // 輸出:sven
  alert ( [ a, b, c, d ] ) // 輸出:[ 1, 2, 3, 4 ]
}.bind( obj, 1, 2 );
func( 3, 4 );

關于call與apply在JavaScript中的作用是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

固镇县| 昌黎县| 沁源县| 郑州市| 普宁市| 色达县| 乐至县| 蒙阴县| 阿城市| 谢通门县| 桃源县| 洪湖市| 曲周县| 临沭县| 织金县| 巴林左旗| 德阳市| 美姑县| 屏东县| 梨树县| 黄石市| 新龙县| 天全县| 兴业县| 桂阳县| 晋江市| 南平市| 五常市| 西乌| 措美县| 揭东县| 万载县| 滁州市| 托里县| 建始县| 克拉玛依市| 铁岭市| 万州区| 阿巴嘎旗| 广南县| 衡水市|