欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JavaScript中的call和apply的用途以及區(qū)別

 更新時(shí)間:2017年01月11日 13:07:48   作者:依然仰望  
本文主要介紹了JavaScript中的call和apply的用途以及區(qū)別。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧

apply 接受兩個(gè)參數(shù),第一個(gè)參數(shù)指定了函數(shù)體內(nèi)this 對(duì)象的指向,第二個(gè)參數(shù)為一個(gè)帶下標(biāo)的集合,這個(gè)集合可以為數(shù)組,也可以為類(lèi)數(shù)組,apply 方法把這個(gè)集合中的元素作為參數(shù)傳遞給被調(diào)用的函數(shù):

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

在這段代碼中,參數(shù) 1、2、3 被放在數(shù)組中一起傳入func函數(shù),它們分別對(duì)應(yīng)func參數(shù)列表中的a、b、c。

call 傳入的參數(shù)數(shù)量不固定,跟apply 相同的是,第一個(gè)參數(shù)也是代表函數(shù)體內(nèi)的this 指向,從第二個(gè)參數(shù)開(kāi)始往后,每個(gè)參數(shù)被依次傳入函數(shù):

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

當(dāng)調(diào)用一個(gè)函數(shù)時(shí),JavaScript 的解釋器并不會(huì)計(jì)較形參和實(shí)參在數(shù)量、類(lèi)型以及順序上的區(qū)別,JavaScript 的參數(shù)在內(nèi)部就是用一個(gè)數(shù)組來(lái)表示的。從這個(gè)意義上說(shuō),apply比call的使用率更高,我們不必關(guān)心具體有多少參數(shù)被傳入函數(shù),只要用apply 一股腦地推過(guò)去就可以了。call是包裝在apply上面的一顆語(yǔ)法糖,如果我們明確地知道函數(shù)接受多少個(gè)參數(shù),而且想一目了然地表達(dá)形參和實(shí)參的對(duì)應(yīng)關(guān)系,那么也可以用call 來(lái)傳送參數(shù)。

call和apply的用途

1. 改變this 指向

call 和apply 最常見(jiàn)的用途是改變函數(shù)內(nèi)部的this 指向,我們來(lái)看個(gè)例子:

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

當(dāng)執(zhí)行g(shù)etName.call( obj1 )這句代碼時(shí),getName 函數(shù)體內(nèi)的this 就指向obj1 對(duì)象,所以此處的

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

實(shí)際上相當(dāng)于:

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

在實(shí)際開(kāi)發(fā)中,經(jīng)常會(huì)遇到this指向被不經(jīng)意改變的場(chǎng)景,比如有一個(gè)div節(jié)點(diǎn),div節(jié)點(diǎn)的onclick 事件中的this 本來(lái)是指向這個(gè)div的:

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

假如該事件函數(shù)中有一個(gè)內(nèi)部函數(shù)func,在事件內(nèi)部調(diào)用func 函數(shù)時(shí),func 函數(shù)體內(nèi)的this就指向了window,而不是我們預(yù)期的div,見(jiàn)如下代碼:

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

這時(shí)候我們用call 來(lái)修正func 函數(shù)內(nèi)的this,使其依然指向div:

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

2. Function.prototype.bind

大部分高級(jí)瀏覽器都實(shí)現(xiàn)了內(nèi)置的Function.prototype.bind,用來(lái)指定函數(shù)內(nèi)部的this 指向,即使沒(méi)有原生的Function.prototype.bind 實(shí)現(xiàn),我們來(lái)模擬一個(gè)也不是難事,代碼如下:

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

我們通過(guò)Function.prototype.bind 來(lái)“包裝”func 函數(shù),并且傳入一個(gè)對(duì)象context 當(dāng)作參數(shù),這個(gè)context 對(duì)象就是我們想修正的this 對(duì)象。

在Function.prototype.bind 的內(nèi)部實(shí)現(xiàn)中,我們先把func 函數(shù)的引用保存起來(lái),然后返回一個(gè)新的函數(shù)。當(dāng)我們?cè)趯?lái)執(zhí)行func 函數(shù)時(shí),實(shí)際上先執(zhí)行的是這個(gè)剛剛返回的新函數(shù)。在新函數(shù)內(nèi)部,self.apply( context, arguments )這句代碼才是執(zhí)行原來(lái)的func 函數(shù),并且指定context對(duì)象為func 函數(shù)體內(nèi)的this。

這是一個(gè)簡(jiǎn)化版的Function.prototype.bind 實(shí)現(xiàn),通常我們還會(huì)把它實(shí)現(xiàn)得稍微復(fù)雜一點(diǎn),

使得可以往func 函數(shù)中預(yù)先填入一些參數(shù):

Function.prototype.bind = function(){
  var self = this, // 保存原函數(shù)
  context = [].shift.call( arguments ), // 需要綁定的this 上下文
  args = [].slice.call( arguments ); // 剩余的參數(shù)轉(zhuǎn)成數(shù)組
  return function(){ // 返回一個(gè)新的函數(shù)
    return self.apply( context, [].concat.call( args, [].slice.call(  arguments ) ) );
    // 執(zhí)行新的函數(shù)的時(shí)候,會(huì)把之前傳入的context 當(dāng)作新函數(shù)體內(nèi)的this
    // 并且組合兩次分別傳入的參數(shù),作為新函數(shù)的參數(shù)
  }
};
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 );

以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,同時(shí)也希望多多支持腳本之家!

相關(guān)文章

  • JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果示例

    JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果示例

    這篇文章主要介紹了JS使用面向?qū)ο蠹夹g(shù)實(shí)現(xiàn)的tab選項(xiàng)卡效果,結(jié)合具體實(shí)例形式分析了js面向?qū)ο蠹夹g(shù)與tab選項(xiàng)卡功能的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-02-02
  • 擴(kuò)展JavaScript功能的正確方法(譯文)

    擴(kuò)展JavaScript功能的正確方法(譯文)

    JavaScript已經(jīng)內(nèi)置了很多強(qiáng)大的方法,但有時(shí)你需要的某個(gè)功能在內(nèi)置的方法中沒(méi)有,我們?cè)趺磥?lái)優(yōu)雅地?cái)U(kuò)展JavaScript功能呢
    2012-04-04
  • JavaScrip數(shù)組刪除特定元素的幾種方法總結(jié)

    JavaScrip數(shù)組刪除特定元素的幾種方法總結(jié)

    從js數(shù)組中刪除指定元素是我們每個(gè)人都遇到的問(wèn)題,網(wǎng)上這方面的資料也很多,但有的時(shí)間過(guò)于久遠(yuǎn),有的內(nèi)容不夠全面,所以自己來(lái)整理下,這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScrip數(shù)組刪除特定元素的多種方法,需要的朋友可以參考下。
    2017-09-09
  • 手把手教你如何編譯打包video.js

    手把手教你如何編譯打包video.js

    這篇文章主要介紹了編譯打包video.js的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-12-12
  • 學(xué)習(xí)JavaScript設(shè)計(jì)模式之代理模式

    學(xué)習(xí)JavaScript設(shè)計(jì)模式之代理模式

    這篇文章主要為大家介紹了JavaScript設(shè)計(jì)模式中的狀態(tài)模式,對(duì)JavaScript設(shè)計(jì)模式感興趣的小伙伴們可以參考一下
    2016-01-01
  • javascript實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器

    javascript實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)簡(jiǎn)易的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-01-01
  • JavaScript網(wǎng)頁(yè)表單form中禁止自動(dòng)提交的兩種方式

    JavaScript網(wǎng)頁(yè)表單form中禁止自動(dòng)提交的兩種方式

    本文是我本人在開(kāi)發(fā)網(wǎng)頁(yè)時(shí),在表單中加入了button按鈕,本來(lái)是用于jQuery點(diǎn)擊相應(yīng)事件的按鈕,然后,但我點(diǎn)擊button時(shí),發(fā)現(xiàn)不是達(dá)到j(luò)Query指定效果,所以在本文中,我們將討論網(wǎng)頁(yè)表單(form)中提交的兩種方式,需要的朋友可以參考下
    2024-06-06
  • 提升頁(yè)面加載速度的插件InstantClick

    提升頁(yè)面加載速度的插件InstantClick

    本篇文章主要介紹了提升頁(yè)面加載速度的插件InstantClick,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-09-09
  • js獲取修改title與jQuery獲取修改title的方法

    js獲取修改title與jQuery獲取修改title的方法

    這篇文章主要介紹了js獲取修改title與jQuery獲取修改title的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02
  • JavaScript學(xué)習(xí)筆記--常用的互動(dòng)方法

    JavaScript學(xué)習(xí)筆記--常用的互動(dòng)方法

    本文對(duì)JavaScript中常用的互動(dòng)方法進(jìn)行實(shí)例分析介紹,圖文并茂,有需要的朋友可以看下
    2016-12-12

最新評(píng)論