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

資訊專欄INFORMATION COLUMN

JavaScript的call/apply/bind方法/函數(shù)原生實(shí)現(xiàn)

gecko23 / 1888人閱讀

摘要:方法簡介在中,函數(shù)中的指向往往在調(diào)用時(shí)才可確定,而提供了方法讓我們得以顯示綁定函數(shù)的指向。它們的第一個(gè)參數(shù)是一個(gè)對象,它們會把這個(gè)對象綁定到調(diào)用他們的函數(shù)內(nèi)的。

call/apply/bind方法簡介

在JavaScript中,函數(shù)中this的指向往往在調(diào)用時(shí)才可確定,而JavaScript提供了call/apply/bind方法讓我們得以顯示綁定函數(shù)的this指向。
它們的第一個(gè)參數(shù)是一個(gè)對象,它們會把這個(gè)對象綁定到調(diào)用他們的函數(shù)內(nèi)的this。因?yàn)槟憧梢灾苯又付?this 的綁定對象,因此我們稱之為顯式綁定。

//用例
var a = { q: 1 };
var b = { q: 2 };
var c = { q: 3 };
function cs(s) {
    console.log(this.q)
}
cs.bind(a)();//1
cs.call(b);//2
cs.apply(c);//3
tips
var s = new fn.myBind({ a: 2333 })();//報(bào)錯(cuò)!!,運(yùn)算優(yōu)先級:屬性訪問>帶參new>函數(shù)調(diào)用>無參new
var s = new (fn.myBind({ a: 2333 }))();//正確姿勢
自定義Call方法實(shí)現(xiàn)

參數(shù)從arguments[1]開始,func.myCall(obj:Object[,agr1:any[,agr2:any[...]]])

if (!Function.prototype.myCall) {
    Function.prototype.myCall = function (targetThis) {
        //targetThis默認(rèn)為windows(嚴(yán)格模式不允許)
        targetThis = targetThis || window;
        //利用對象調(diào)用指定this
        targetThis.fn = this;
        //收集參數(shù)
        var agrs = [];
        //因?yàn)閍rguments[0]===targetThis,故從下標(biāo)1開始
        for (var ge = 1, len = arguments.length; ge < len; ge++) {
            agrs.push("arguments[" + ge + "]");
        }
        //利用eval展開參數(shù) 并執(zhí)行函數(shù)
        var result = eval("targetThis.fn(" + agrs + ")");
        //刪除附加對象的屬性以消除副作用
        delete targetThis.fn;
        //返回結(jié)果
        return result;
    }
}
自定義apply方法實(shí)現(xiàn)

參數(shù)放在數(shù)組里func.call(obj:Object[,agr:Array])

if (!Function.prototype.myApply) {
    Function.prototype.myApply = function (targetThis, arrAgrs) {
        //targetThis默認(rèn)為windows(嚴(yán)格模式不允許)
        targetThis = targetThis || window;
        //利用對象調(diào)用指定this
        targetThis.fn = this;
        var agrs = [];
        //收集參數(shù)數(shù)組
        for (var ge = 0, len = arrAgrs.length; ge < len; ge++) {
            agrs.push("arrAgrs[" + ge + "]");
        }
        //利用eval展開參數(shù) 并執(zhí)行函數(shù)
        var result = eval(" targetThis.fn(" + agrs + ")");
        //刪除附加對象的屬性以消除副作用
        delete targetThis.fn;
        //返回結(jié)果
        return result;
    }
}

自定義bind方法實(shí)現(xiàn)

參數(shù)從arguments[1]開始,func.myCall(obj:Object[,agr1:any[,agr2:any[...]]])

//考慮參數(shù)合并以及new優(yōu)先級和原型繼承
if (!Function.prototype.myBind) {
    Function.prototype.myBind = function (targetThis) {
        //若非函數(shù)對象來調(diào)用本方法,報(bào)異常
        if (typeof this !== "function") {
            throw new TypeError(
                "Function.prototype.bind error"
            );
        }
        //收集參數(shù)
        var bindArgs = Array.prototype.slice.call(arguments, 1),
            originFunction = this,//保存原始this(原始函數(shù))
            fnProto = function () { },//利用空函數(shù)間接鏈接prototype以應(yīng)對new時(shí)的原型繼承
            fnBounding = function () {
                //考核new操作this綁定優(yōu)先
                return originFunction.apply(
                    (
                        this instanceof fnProto ? this : targetThis
                    ),
                    bindArgs.concat(
                        Array.prototype.slice.call(arguments)
                    )
                )
            };
        fnProto.prototype = this.prototype;//鏈接原型
        //new一個(gè)fnProto以實(shí)現(xiàn)簡潔繼承原型,防止對fnBounding.prototype的操作污染originFunction原型prototype
        fnBounding.prototype = new fnProto();
        return fnBounding;
    };
}


軟綁定

bind之后可以再bind或call/apply

if (!Function.prototype.softBind) {
    Function.prototype.softBind = function (obj) {
        var fn = this;
        // 捕獲所有 bindArgs 參數(shù)
        var bindArgs = [].slice.call(arguments, 1);
        var fnBounding = function () {
            return fn.apply(
                (!this || this === (window || global)) ?
                    obj : this,
                curried.concat.apply(bindArgs , arguments)
            );
        };
        fnBounding .prototype = Object.create(fn.prototype);//鏈接原型
        return fnBounding ;
    };
}

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

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

相關(guān)文章

  • 可能遇到假面試題:不用callapply方法模擬實(shí)現(xiàn)ES5bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    李世贊 評論0 收藏0
  • 可能遇到假面試題:不用callapply方法模擬實(shí)現(xiàn)ES5bind方法

    摘要:來自朋友去某信用卡管家的做的一道面試題,用原生模擬的方法,不準(zhǔn)用和方法。他們的用途相同,都是在特定的作用域中調(diào)用函數(shù)。不同之處在于,方法傳遞給調(diào)用函數(shù)的參數(shù)是逐個(gè)列出的,而則是要寫在數(shù)組中。 本文首發(fā)我的個(gè)人博客:前端小密圈,評論交流送1024邀請碼,嘿嘿嘿?。 來自朋友去某信用卡管家的做的一道面試題,用原生JavaScript模擬ES5的bind方法,不準(zhǔn)用call和bind方法。 ...

    ConardLi 評論0 收藏0
  • JS中callapplybind方法詳解

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

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

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

    lastSeries 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<