為何常常栽在call,apply,bind這些函數(shù)

1. call纷妆、apply腌闯、bind作用于函數(shù)上

2. call

<script type="text/javascript">
    var Dog = function () {
        this.name = "旺星人";
        this.shout = function () {
            alert(this.name);
        }
    };

    var Cat = function () {
        this.name = "喵星人";
    };

    var dog = new Dog();
    var cat = new Cat();
    dog.shout.call(cat); //dog.shout中的this對象煌寇,將指向cat對象秃殉。
    dog.shout();    //this還是指向dog 
</script>

3. apply

<script type="text/javascript">
    var xh = {
        name: "小紅",
        job: "JS工程師"
    };

    var xm = {
        name: "小明",
        job: "資深前端開發(fā)工程師"
    };

    var jx = {
        name: "杰西",
        job: "前端開發(fā)總監(jiān)"
    };

    //杰西奸鸯,男咪笑,今年24歲,在前端開發(fā)網(wǎng)擔任前端開發(fā)總監(jiān)一職
    function myjob(gender, age, company) {
        alert(this.name + "娄涩," + gender + "窗怒,今年" + age + "歲,在" + company + "擔任" + this.job + "一職");
    }

    myjob.call(xh, "女", 22, "騰訊");
    myjob.call(xm, "男", 23, "谷歌");
    myjob.call(jx, "男", 24, "前端開發(fā)網(wǎng)");

    myjob.apply(xh, ["女", 22, "騰訊"]);
    myjob.apply(xm, ["男", 23, "谷歌"]);
    myjob.apply(jx, ["男", 24, "前端開發(fā)網(wǎng)"]);
</script>
總結(jié):
  • 在call傳入?yún)?shù)的時候蓄拣,需要與函數(shù)所接受的參數(shù)一一對應扬虚;
  • 在apply傳入?yún)?shù)的時候,則以數(shù)組的方式傳入,數(shù)組中的元素需要與函數(shù)所接受的參數(shù)一一對應癌别;
  • call戒财、apply都是屬于立即調(diào)用

3.bind

  • MDN的解釋是:bind()方法會創(chuàng)建一個(新函數(shù)),稱為綁定函數(shù)堪置,當調(diào)用這個綁定函數(shù)時躬存,綁定函數(shù)會以創(chuàng)建它時傳入 bind()方法的第一個參數(shù)作為 this,傳入 bind() 方法的第二個以及以后的參數(shù)加上綁定函數(shù)運行時本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調(diào)用原函數(shù)舀锨。
// 1.常用this賦值寫法
<script type="text/javascript">
    var foo = {
        bar: 1,
        eventBind: function () {
            var _this = this;
            $('.someClass').on('click', function (event) {
                /* Act on the event */
                console.log(_this.bar); //1
            });
        }
    }
</script>

// 2.bind()改變this指向
<script type="text/javascript">
    var foo = {
        bar: 1,
        eventBind: function () {
            $('.someClass').on('click', function (event) {
                /* Act on the event */
                console.log(this.bar); //1
            }.bind(this));
        }
    }
</script>
  • 直接使用對象屬性
<script type="text/javascript">

    var jx = {
        name: "杰西",
        gender: "男",
        age: 24,
        company: "前端開發(fā)網(wǎng)(W3Cfuns.com)",
        job: "前端開發(fā)總監(jiān)",
        say: function () {
            alert(this.name + "岭洲," + this.gender + ",今年" + this.age + "歲坎匿,在" + this.company + "擔任" + this.job + "一職");
        }
    };

    jx.say();

    var xm = jx.say.bind({
        name: "小明",
        gender: "男",
        age: 23,
        company: "谷歌 Google",
        job: "資深前端開發(fā)工程師"
    });
    xm();

    //注意:JavaScript1.8.5版本中盾剩,原生實現(xiàn)bind方法,目前IE9+替蔬,F(xiàn)F4告私,Chrome7+,opera
</script>
  • 重復使用bind會有什么效果
<script type="text/javascript">
    var bar = function () {
        console.log(this.x);
    }
    var foo = {
        x: 3
    }
    var sed = {
        x: 4
    }
    var func = bar.bind(foo).bind(sed);
    func(); //?

    var fiv = {
        x: 5
    }
    var func = bar.bind(foo).bind(sed).bind(fiv);
    func(); //?
</script>
  • 答案是承桥,兩次都仍將輸出 3 驻粟,而非期待中的 4 和 5 。原因是快毛,在Javascript中格嗅,多次 bind() 是無效的。更深層次的原因唠帝, bind() 的實現(xiàn)屯掖,相當于使用函數(shù)在內(nèi)部包了一個 call / apply ,第二次 bind() 相當于再包住第一次 bind() ,故第二次以后的 bind 是無法生效的襟衰。

  • apply贴铜、call、bind比較

<script type="text/javascript">
    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
</script>
  • 三個輸出的都是81瀑晒,但是注意看使用 bind() 方法的绍坝,他后面多了對括號。
  • 也就是說苔悦,區(qū)別是轩褐,當你希望改變上下文環(huán)境之后并非立即執(zhí)行,而是回調(diào)執(zhí)行的時候玖详,使用 bind() 方法把介。而 apply/call 則會立即執(zhí)行函數(shù)。

再總結(jié)一下:

  • apply 蟋座、 call 拗踢、bind 三者都是用來改變函數(shù)的this對象的指向的;
  • apply 向臀、 call 巢墅、bind 三者第一個參數(shù)都是this要指向的對象,也就是想指定的上下文;
  • apply 君纫、 call 驯遇、bind 三者都可以利用后續(xù)參數(shù)傳參;
  • bind 是返回對應函數(shù)蓄髓,便于稍后調(diào)用妹懒;apply 、call 則是立即調(diào)用 双吆。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市会前,隨后出現(xiàn)的幾起案子好乐,更是在濱河造成了極大的恐慌,老刑警劉巖瓦宜,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚万,死亡現(xiàn)場離奇詭異,居然都是意外死亡临庇,警方通過查閱死者的電腦和手機反璃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來假夺,“玉大人淮蜈,你說我怎么就攤上這事∫丫恚” “怎么了梧田?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侧蘸。 經(jīng)常有香客問我裁眯,道長,這世上最難降的妖魔是什么讳癌? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任穿稳,我火速辦了婚禮,結(jié)果婚禮上晌坤,老公的妹妹穿的比我還像新娘逢艘。我一直安慰自己,他們只是感情好泡仗,可當我...
    茶點故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布埋虹。 她就那樣靜靜地躺著,像睡著了一般娩怎。 火紅的嫁衣襯著肌膚如雪搔课。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機與錄音爬泥,去河邊找鬼柬讨。 笑死,一個胖子當著我的面吹牛袍啡,可吹牛的內(nèi)容都是我干的踩官。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼境输,長吁一口氣:“原來是場噩夢啊……” “哼蔗牡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嗅剖,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤辩越,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后信粮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黔攒,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年强缘,在試婚紗的時候發(fā)現(xiàn)自己被綠了督惰。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡旅掂,死狀恐怖赏胚,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情辞友,我是刑警寧澤栅哀,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布,位于F島的核電站称龙,受9級特大地震影響留拾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鲫尊,卻給世界環(huán)境...
    茶點故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一痴柔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧疫向,春花似錦咳蔚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至舌涨,卻和暖如春糯耍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工温技, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留革为,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓舵鳞,卻偏偏與公主長得像震檩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蜓堕,可洞房花燭夜當晚...
    茶點故事閱讀 43,724評論 2 351

推薦閱讀更多精彩內(nèi)容