国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

比較call( ) apply( ) bind( )

cheng10 / 1624人閱讀

摘要:簡(jiǎn)單比較一下與和的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,在函數(shù)體內(nèi)通過(guò)來(lái)獲得對(duì)它的引用。而則會(huì)立即執(zhí)行函數(shù)。

簡(jiǎn)單比較一下call() apply() bind()

《JavaScript: The Definitive Guide》

call()與apply()

call()和apply()的第一個(gè)實(shí)參是要調(diào)用函數(shù)的母對(duì)象,它是調(diào)用上下文,在函數(shù)體內(nèi)通過(guò)this來(lái)獲得對(duì)它的引用。簡(jiǎn)單來(lái)說(shuō)就是把一個(gè)方法綁定到一個(gè)對(duì)象上去調(diào)用:

栗如,要想以對(duì)象o的方法來(lái)調(diào)用函數(shù)f():

f.call(o);
f.apply(o);

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

o.m = f; //將f存儲(chǔ)為o的臨時(shí)方法
o.m(); //調(diào)用它,不傳入?yún)?shù)
delete o.m; //將臨時(shí)方法刪除

--> 對(duì)于call(),第一個(gè)實(shí)參之后的所有實(shí)參就是要傳入待調(diào)用函數(shù)的值。栗如:

//以對(duì)象o的方法的形式調(diào)用函數(shù)f(),并傳入兩個(gè)參數(shù)
f.call(o, 1, 2);

--> 對(duì)于apply(),它的實(shí)參都放入一個(gè)數(shù)組當(dāng)中:

f.apply(o,[1, 2]);

給apply()傳入的參數(shù)數(shù)組可以是任意長(zhǎng)度的,栗如:

//找出一個(gè)數(shù)組中最大的數(shù)值元素
var biggest = Math.max.apply(Math, array_of_numbers);

傳入apply()的參數(shù)數(shù)組可以是類數(shù)組對(duì)象也可以是真實(shí)數(shù)組。實(shí)際上,可以將當(dāng)前函數(shù)的arguments數(shù)組直接傳入apply()來(lái)調(diào)用另一個(gè)函數(shù):

//將對(duì)象o中名為m的方法替換為另一個(gè)方法
//可以在調(diào)用原始方法之前和之后記錄日志消息
function trace(o, m) {
    var original = o[m];//在閉包中保存原始方法
    o[m] = function() {//定義新的方法
        console.log(new Date(), "Entering", m);
        var result = original.apply(this, arguments);//調(diào)用原始函數(shù)
        console.log(new Date(), "Exiting", m);
        return result;
     };
}
//這個(gè)新方法是包裹原始方法的另一個(gè)泛函數(shù) (monkey-patching)?
bind() 方法

bind()是ES5中的方法。
當(dāng)在函數(shù)f()上調(diào)用bind()方法并傳入一個(gè)對(duì)象o作為參數(shù),這個(gè)方法將返回一個(gè)新的函數(shù),(以函數(shù)調(diào)用的方式)調(diào)用新的函數(shù)將會(huì)把原始的函數(shù)f()當(dāng)作o的方法來(lái)調(diào)用。傳入新的函數(shù)的任何實(shí)參都講傳入原始函數(shù)。栗如:

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

可以用ES3簡(jiǎn)單模擬:

function bind(f, o) {
    if(f.bind) return f.bind(o);
    else return function() {
        return f.apply(o, arguments);
    }
}

然而,bind()方法不僅僅是將函數(shù)綁定至一個(gè)對(duì)象----除了第一個(gè)參數(shù)外,傳入bind()的實(shí)參也會(huì)綁定至this,這個(gè)附帶的應(yīng)用是一種常見(jiàn)的函數(shù)式編程技術(shù),也被稱為“柯里化“。

function f(y, z) { return this.x + y + z }
var g = f.bind({ x: 1 }, 2);
g(3);//=> 6 this.x綁定到1, y綁定到2, z綁定到3

如果用ES3模擬:

if(!Function.prototype.bind){
    Function.prototype.bind = function(o /*, args*/){
        //將this和arguments的值保存至變量中
        //以便在后面嵌套的函數(shù)中可以使用它們
        var self = this, boundArgs = arguments;
        
        //bind方法的返回值是一個(gè)函數(shù)
        return function(){
            //創(chuàng)建一個(gè)實(shí)參列表,將傳入bind()的第二個(gè)及后續(xù)的實(shí)參傳入這個(gè)參數(shù)
            var args = [], i;
            for(i=1; i

http://web.jobbole.com/83642/
深入淺出妙用 Javascript 中 apply、call、bind

一個(gè)比較

var obj = {
    x: 81,
};
 
var foo = {
    getX: function() {
        return this.x;
    }
}
 
console.log(foo.getX.bind(obj)());  //81
console.log(foo.getX.call(obj));    //81
console.log(foo.getX.apply(obj));   //81

三個(gè)輸出的都是81,但是注意看使用 bind() 方法的,他后面多了對(duì)括號(hào)。

也就是說(shuō),區(qū)別是,當(dāng)你希望改變上下文環(huán)境之后并非立即執(zhí)行,而是回調(diào)執(zhí)行的時(shí)候,使用 bind() 方法。而 apply/call 則會(huì)立即執(zhí)行函數(shù)。

一個(gè)總結(jié)

apply 、 call 、bind 三者都是用來(lái)改變函數(shù)的this對(duì)象的指向的;

apply 、 call 、bind 三者第一個(gè)參數(shù)都是this要指向的對(duì)象,也就是想指定的上下文;

apply 、 call 、bind 三者都可以利用后續(xù)參數(shù)傳參;

bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。

一道題:

定義一個(gè) log 方法,讓它可以代理 console.log 方法

function log(){
    console.log.apply(console, arguments);
}

若要給每一個(gè) log 消息添加一個(gè)”(app)”的前輟?

//該怎么做比較優(yōu)雅呢?這個(gè)時(shí)候需要想到arguments參數(shù)是個(gè)偽數(shù)組,通過(guò) //Array.prototype.slice.call 轉(zhuǎn)化為標(biāo)準(zhǔn)數(shù)組,再使用數(shù)組方法unshift
function log(){
    var args = Array.prototype.slice.call(arguments);
    args.unshift("(app)");
    console.log.apply(console, args);
}

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/82171.html

相關(guān)文章

  • JS中的callapplybind方法詳解

    摘要:不能應(yīng)用下的等方法。首先我們可以通過(guò)給目標(biāo)函數(shù)指定作用域來(lái)簡(jiǎn)單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無(wú)效的。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    zombieda 評(píng)論0 收藏0
  • JS基礎(chǔ)篇--callapplybind方法詳解

    摘要:首先我們可以通過(guò)給目標(biāo)函數(shù)指定作用域來(lái)簡(jiǎn)單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無(wú)效的。而則會(huì)立即執(zhí)行函數(shù)。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...

    lastSeries 評(píng)論0 收藏0
  • bind()、call()、apply()理解及用法

    摘要:首先,我們判斷是否存在方法,然后,若不存在,向?qū)ο蟮脑椭刑砑幼远x的方法。指向調(diào)用它的對(duì)象。總之三個(gè)的使用區(qū)別都是用來(lái)改變函數(shù)的對(duì)象的指向的第一個(gè)參數(shù)都是要指向的對(duì)象都可以利用后續(xù)參數(shù)傳參是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用,是立即調(diào)用 apply和call都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的上下文而存在的(就是為了改變函數(shù)內(nèi)部this的指向),F(xiàn)unction對(duì)象的方法,每個(gè)函數(shù)都能調(diào)用; 使用a...

    hoohack 評(píng)論0 收藏0
  • JavaScript函數(shù)的callapplybind

    摘要:它們有明確的和成員函數(shù)的定義,只有的實(shí)例才能調(diào)用這個(gè)的成員函數(shù)。用和調(diào)用函數(shù)里用和來(lái)指定函數(shù)調(diào)用的,即指針的指向。同樣,對(duì)于一個(gè)后的函數(shù)使用或者,也無(wú)法改變它的執(zhí)行,原理和上面是一樣的。 函數(shù)里的this指針 要理解call,apply和bind,那得先知道JavaScript里的this指針。JavaScript里任何函數(shù)的執(zhí)行都有一個(gè)上下文(context),也就是JavaScri...

    alighters 評(píng)論0 收藏0
  • js 面試官想了解你有多理解call,apply,bind?

    摘要:返回值這段在下方應(yīng)用中有詳細(xì)的示例解析。回調(diào)函數(shù)丟失的解決方案綁定回調(diào)函數(shù)的指向這是典型的應(yīng)用場(chǎng)景綁定指向,用做回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數(shù)原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當(dāng)重要的概念,與 this...

    wuaiqiu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<