總結JavaScript中的this

來源:互聯網
上載者:User

1.理解
      this為晚綁定. 確定的值為最終調用時所依附的對象, 即xxx.yyy()文法. 沒有指定則為全域對象, 網頁中為window對象.
      指派陳述式僅複製函數對象的引用. 函數定義時的綁定資訊將被丟棄.
2.實際
      由於this於運行時會被改寫,一個常見的技巧是用var o_this = this, 然後通過閉包傳遞.
      可以通過Funtion的apply方法手工綁定this, 類比C#中委託中的行為.

var g_prefix = "I'm a ", g_postfix = ".";
var g_says = function(prefix, postfix) {
    alert(prefix + this.msg + postfix);
}

window.msg = "windoW";

var man = {    msg: "maN",    says: g_says, hisCat: { msg: "caT", says: g_says } }

g_says(g_prefix, g_postfix); // I'm a windoW.
man.says(g_prefix, g_postfix); // I'm a maN.
man.hisCat.says(g_prefix, g_postfix); // I'm a caT.
man.simulateCatSayingButFail = man.hisCat.says; // Want to simulate cats saying..
man.simulateCatSayingButFail(g_prefix, g_postfix); // ..but fails. The man is saying "I'm a maN."

// Really want to simulate cat saying?

Function.prototype.bind = function(obj) {
    var o_this = this;
    return function() {
        return o_this.apply(obj, arguments);
    };
}

man.simulateCatSaying = man.hisCat.says.bind(man.hisCat); // Want to simulate cats saying..
man.simulateCatSaying(g_prefix, g_postfix); // ..Now saying "I'm a caT."

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.