亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

JavaScirpt 的 bind 函數(shù)究竟做了哪些事

mzlogin / 966人閱讀

摘要:而且當(dāng)時(shí),會把的賦給函數(shù),而函數(shù)返回的是,所以這時(shí)的也賦給了。實(shí)例化總結(jié)所以函數(shù)總共做了哪幾件事呢沒有實(shí)例化時(shí),將傳入對象的參數(shù)引用到當(dāng)前函數(shù),執(zhí)行當(dāng)前函數(shù),返回結(jié)果實(shí)例化時(shí),使用操作生成新函數(shù),原函數(shù)的賦給新函數(shù),執(zhí)行新函數(shù),并返回新函數(shù)

文章原地址:https://github.com/catchonme/...

ES5 實(shí)現(xiàn) bind 函數(shù)如下

Function.prototype.bind = function(that){
        var self = this,
            args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
            F = function(){};

        var bound = function(){
            var context = that, length = arguments.length;
            if (this instanceof bound){
                F.prototype = self.prototype;
                context = new F;
            }
            var result = (!args && !length)
                ? self.call(context)
                : self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
            return context == that ? result : context;
        };
        return bound;
    }

測試1

var bar = function() {
        console.log(this.x)
    }
var foo = {
  x: 3
}

var func = bar.bind(foo);
func(); // 3

bar 函數(shù)綁定foo 中的x 值,然后輸出3

bind 函數(shù)中最主要的是bound 函數(shù),bound 函數(shù)做了哪些事呢?

首先context 存儲傳入的thatcontext 中,判斷this instanceof bound ,那什么時(shí)候this instanceof bound == true 呢?在測試1中的案例中,this instanceof bound false ,打印此時(shí)的this 輸出Window?{postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window,?…} ,發(fā)現(xiàn)是window 對象,因?yàn)?b>foo 本身就是在window 對象中。

所以此時(shí)直接執(zhí)行self.call(context) ,返回執(zhí)行的結(jié)果3 ,就是我們測試1中的結(jié)果。

那什么時(shí)候this instanceof bound == true 呢,而且此時(shí)還需要使用空函數(shù)F 來獲取主函數(shù)的prototype ,

答案是實(shí)例化,什么時(shí)候?qū)嵗兀?/p>

測試2

var bar = function() {
    console.log(this.x)
}
bar.prototype.name = function(){
  this.name = "name";
}
var foo = {
  x: 3
}

var func = bar.bind(foo);
var newFunc = new func; // undefined
newFunc.name(); // name

bar.bind(foo) 進(jìn)行實(shí)例化,此時(shí)因?yàn)檫M(jìn)行了new 操作,new 操作做了什么呢,參考new操作符里面到底發(fā)生了什么?所以此時(shí)的this 為新生成的bound {} 對象,constructorbound 函數(shù),所以此時(shí)this instanceof bound == true

那為什么bar.bind(foo)foo 對象傳遞的時(shí)候,沒有輸出3 而是undefined 呢?也是因?yàn)?b>new 操作,當(dāng)前的上下文已經(jīng)是新生成的newFunc 函數(shù)了。而且當(dāng)this instanceof bound == true 時(shí),會把barprototype 賦給F 函數(shù),而bound 函數(shù)返回的是new F ,所以這時(shí)barprototype 也賦給newFunc 了。

我們看看ES6的操作,結(jié)果和上述例子是一樣的。

var bar = function() {
    console.log(this.x)
}
bar.prototype.name = function(){
    console.log("name")
}
var foo = {
    x: 3
}
var func = bar.bind(foo);
func(); // 3
// 實(shí)例化
var newFunc = new func; // undefined
    newFunc.name(); // name

總結(jié):

所以bind 函數(shù)總共做了哪幾件事呢?

沒有實(shí)例化時(shí),將傳入對象的參數(shù)引用到當(dāng)前函數(shù),執(zhí)行當(dāng)前函數(shù),返回結(jié)果

實(shí)例化時(shí),使用new 操作生成新函數(shù),原函數(shù)的prototype 賦給新函數(shù),執(zhí)行新函數(shù),并返回新函數(shù)

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

轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/94678.html

相關(guān)文章

  • 前端基本功-示例代碼 (二)

    摘要:前端基本功示例代碼一點(diǎn)這里前端基本功示例代碼二點(diǎn)這里一像素偽類實(shí)現(xiàn)對于老項(xiàng)目,有沒有什么辦法能兼容的尷尬問題了,個(gè)人認(rèn)為偽類是比較完美的方法了。 前端基本功-示例代碼 (一) 點(diǎn)這里前端基本功-示例代碼 (二) 點(diǎn)這里 1.一像素 偽類 + transform 實(shí)現(xiàn)對于老項(xiàng)目,有沒有什么辦法能兼容1px的尷尬問題了,個(gè)人認(rèn)為偽類+transform是比較完美的方法了。 原理是把原先元素...

    Java3y 評論0 收藏0
  • 前端基本功-示例代碼 (二)

    摘要:前端基本功示例代碼一點(diǎn)這里前端基本功示例代碼二點(diǎn)這里一像素偽類實(shí)現(xiàn)對于老項(xiàng)目,有沒有什么辦法能兼容的尷尬問題了,個(gè)人認(rèn)為偽類是比較完美的方法了。 前端基本功-示例代碼 (一) 點(diǎn)這里前端基本功-示例代碼 (二) 點(diǎn)這里 1.一像素 偽類 + transform 實(shí)現(xiàn)對于老項(xiàng)目,有沒有什么辦法能兼容1px的尷尬問題了,個(gè)人認(rèn)為偽類+transform是比較完美的方法了。 原理是把原先元素...

    wpw 評論0 收藏0
  • 深入理解JavaScirpt函數(shù)調(diào)用和"this"

    摘要:簡單的函數(shù)調(diào)用顯而易見,一直用調(diào)用函數(shù)將會非常煩人。規(guī)范說幾乎總是被傳遞,但不在嚴(yán)格模式下時(shí)被調(diào)用函數(shù)應(yīng)該將其更改為全局對象。實(shí)際上,規(guī)范有一個(gè)和都使用的原語內(nèi)部稱為。 過去很多年里,我看到過太多關(guān)于JavaScript函數(shù)調(diào)用的混淆。尤其是,很多人抱怨函數(shù)調(diào)用中this的語義令人困惑。在我看來,通過理解核心函數(shù)調(diào)用原語,然后將其他所有調(diào)用函數(shù)的方法視為在原語之上的語法糖,如此便可澄清...

    bladefury 評論0 收藏0
  • 2018 淺談前端面試那些

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識點(diǎn) 知識點(diǎn)匯總 1.HTML HTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫法css js放置位置和原因...

    LiuRhoRamen 評論0 收藏0
  • 2018 淺談前端面試那些

    摘要:聲明的變量不得改變值,這意味著,一旦聲明變量,就必須立即初始化,不能留到以后賦值。 雖然今年沒有換工作的打算 但為了跟上時(shí)代的腳步 還是忍不住整理了一份最新前端知識點(diǎn) 知識點(diǎn)匯總 1.HTML HTML5新特性,語義化瀏覽器的標(biāo)準(zhǔn)模式和怪異模式xhtml和html的區(qū)別使用data-的好處meta標(biāo)簽canvasHTML廢棄的標(biāo)簽IE6 bug,和一些定位寫法css js放置位置和原因...

    stormgens 評論0 收藏0

發(fā)表評論

0條評論

mzlogin

|高級講師

TA的文章

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