成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

關(guān)于this的全面解析(下)

philadelphia / 1119人閱讀

摘要:關(guān)于的全棉解析上的文章地址判斷函數(shù)是否在中調(diào)用綁定如果是的話綁定的是新創(chuàng)建的對象。顯而易見,這種方式可能會導(dǎo)致許多難以分析和追蹤的。默認(rèn)在嚴(yán)格模式下綁定到,否則綁定到全局對象。

關(guān)于this的全棉解析(上)的文章地址

判斷this

函數(shù)是否在new中調(diào)用(new綁定)?如果是的話this綁定的是新創(chuàng)建的對象。

bar = new foo()

函數(shù)是否通過call、apply(顯式綁定)或者硬綁定調(diào)用?如果是的話,this綁定的是指定的對象。

bar = foo.call(obj2)

函數(shù)是否在某個上下文對象中調(diào)用(隱式綁定)?如果是的話,this綁定的是那個上下文對象。

bar = obj1.foo()

如果都不是的話,使用默認(rèn)綁定。如果在嚴(yán)格模式下,就綁定到undefined,否則綁定到全局對象。

bar = foo();

綁定例外
被忽略的this

如果把null或者undefined作為this的綁定對象傳入call、apply或者bind,這些值在調(diào)用時會被忽略,實際應(yīng)用的是默認(rèn)綁定規(guī)則。

    function foo() {
    console.log(this.a);
    }
    var a = 2;
    foo.call(null); //2

然而,總是使用null來忽略this綁定可能產(chǎn)生一些副作用。如果某個函數(shù)確實使用了this,那默認(rèn)綁定規(guī)則會把this綁定到全局對象(在瀏覽器中全局對象為window),這將導(dǎo)致不可預(yù)計的后果(比如修改全局對象)。
顯而易見,這種方式可能會導(dǎo)致許多難以分析和追蹤的bug。

更安全的this

一種“更安全”的做法是傳入一個特殊的對象、把this綁定到這個對象不會對你的程序產(chǎn)生副作用。
在JavaScript中創(chuàng)建一個空對象最簡單的方法都是Object.create(null),但是并不會創(chuàng)建Object.prototype這個委托。

    function foo(a, b) {
        console.log("a:" + a + ", b:" + b);
    }
    //創(chuàng)建一個新對象
    var emptyObj = Object.create(null);
    foo.apply(emptyObj, [2, 3])
    var bar = foo.bind(emptyObj, 2);
    bar(3);
間接引用

間接引用最容易在賦值時發(fā)生。

 

    function foo() {
        console.log(this.a);
    }
    var a = 2;
    var o = {
        a: 3,
        foo: foo
    };
    var p = {
        a: 4
    };
    o.foo(); //3
    (p.foo = o.foo)() //2

賦值表達式p.foo= o.foo的返回值是目標(biāo)函數(shù)的引用,因此調(diào)用位置是foo()而不是p.foo()或者o.foo(),所以綁定的是全局對象。

小結(jié)

如果要判斷一個運行中函數(shù)的this綁定,就需要找到這個函數(shù)的直接調(diào)用位置。找到之后就可以順序應(yīng)用下面這四條規(guī)則來判斷this的綁定對象。

由new調(diào)用?綁定到新創(chuàng)建的對象。

由call或者apply(或者bind)調(diào)用?綁定到指定的對象。

由上下文對象調(diào)用?綁定到那個上下文對象。

默認(rèn):在嚴(yán)格模式下綁定到undefined,否則綁定到全局對象。

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

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

相關(guān)文章

  • 關(guān)于this全面解析(上)

    摘要:關(guān)于的全面解析下頁面鏈接的調(diào)用位置調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置而不是聲明的位置,尋找調(diào)用位置就是尋找函數(shù)被調(diào)用的位置,最重要的是分析調(diào)用棧就是為了到達當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)。因此,調(diào)用函數(shù)時被綁定到這個對象上,所以和是一樣的。 關(guān)于this的全面解析(下)頁面鏈接 this的調(diào)用位置 調(diào)用位置就是函數(shù)在代碼中被調(diào)用的位置(而不是聲明的位置),尋找調(diào)用位置就是尋找函數(shù)被調(diào)用...

    caige 評論0 收藏0
  • this全面解析(一)

    摘要:調(diào)用棧就是為了到達當(dāng)前執(zhí)行位置所調(diào)用的所有函數(shù)。由于無法控制回調(diào)函數(shù)的執(zhí)行方式,因此就沒有辦法控制調(diào)用位置得到期望的綁定,下一節(jié)我們會介紹如何通過固定來修復(fù)這個問題。 在《你不知道的this》中我們排除了對于this的錯誤理解,并且明白了每個函數(shù)的this是在調(diào)用時綁定的,完全取決于函數(shù)的調(diào)用位置。在本節(jié)中我們主要介紹一下幾個主要內(nèi)容: 什么是調(diào)用位置 綁定規(guī)則 this詞法 調(diào)用...

    darry 評論0 收藏0
  • this全面解析(二)

    摘要:在傳統(tǒng)的面向類的語言中,構(gòu)造函數(shù)是類中的一些特殊方法,使用初始化類是會調(diào)用類中的構(gòu)造函數(shù)。 在上一節(jié)中我們詳細(xì)介紹了this的兩種綁定方式,默認(rèn)綁定和隱式綁定,在這一節(jié)我們繼續(xù)介紹this的另外兩種綁定方式顯示綁定和new綁定。那么,我們要解決的問題當(dāng)然就是上一節(jié)中我們提到的:this丟失! 顯式綁定 在隱式綁定中,我們必須在一個對象的內(nèi)部包含一個指向函數(shù)的屬性,并通過這個屬性間接引用...

    iflove 評論0 收藏0
  • Java雜記17—String全面解析

    摘要:所以也就是說在沒有的基礎(chǔ)上,執(zhí)行代碼會在串池中創(chuàng)建一個,也會在堆內(nèi)存中再出來一個。不可變性的優(yōu)點安全性字符串不可變安全性的考慮處于兩個方面,數(shù)據(jù)安全和線程安全。 摘要: String基本特性,String源碼,為什么String不可變? 前言 基于字符串String在java中的地位,關(guān)于String的常識性知識就不多做介紹了,我們先來看一段代碼 public class Test {...

    jeffrey_up 評論0 收藏0
  • 用小程序·云開發(fā)打造功能全面博客小程序丨實戰(zhàn)

    摘要:用小程序云開發(fā)將博客小程序常用功能一網(wǎng)打盡本文介紹博客小程序的詳情頁的功能按鈕如何實現(xiàn),具體包括評論點贊收藏和海報功能,這里記錄下整個實現(xiàn)過程和實際編碼中的一些坑??紤]到小程序本身的大小限制,使用的方式是最佳的。 用小程序·云開發(fā)將博客小程序常用功能一網(wǎng)打盡 本文介紹mini博客小程序的詳情頁的功能按鈕如何實現(xiàn),具體包括評論、點贊、收藏和海報功能,這里記錄下整個實現(xiàn)過程和實際編碼中的一...

    cc17 評論0 收藏0

發(fā)表評論

0條評論

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