jquery工具方法proxy

來源:互聯網
上載者:User

標籤:

proxy : 改變this指向

使用方法1:
function show(){

  alert(this);

}
$.proxy(show,document)();  //document

使用方法2:
function show(n1,n2){

  alert(n1);
  alert(n2);

  alert(this);

}
$.proxy(show,document)(3,4);  //document  3  4
$.proxy(show,document,3,4)();  //document  3  4
$.proxy(show,document,3)(4);  //document  3  4

使用方法3:
var obj = {

  show:function(){

    alert(this);

  }

};

$(document).click($.proxy(obj,‘show‘)); //object

 

從proxy方法的源碼可以看出,以下程式碼片段是針對 ‘ 使用方法3 ‘ 做了處理,它允許第二個參數為字串,其實等同於:$(document).click($.proxy(obj.show,obj));

if ( typeof context === "string" ) {    tmp = fn[ context ];    context = fn;    fn = tmp;}

 

以下程式碼片段是針對傳參的處理,先使用core_slice.call截取第3個參數到最後,再擷取調用時的參數,最後合并。

// Simulated bindargs = core_slice.call( arguments, 2 );proxy = function() {    return fn.apply( context, args.concat( core_slice.call( arguments ) ) );};

 

proxy完整的代碼:

var core_slice = Array.prototype.slice,        ....................jQuery.extend({    ......................    // A global GUID counter for objects    guid: 1,    // Bind a function to a context, optionally partially applying any    // arguments.    proxy: function( fn, context ) {        var tmp, args, proxy;        if ( typeof context === "string" ) {            tmp = fn[ context ];            context = fn;            fn = tmp;        }        // Quick check to determine if target is callable, in the spec        // this throws a TypeError, but we will just return undefined.        if ( !jQuery.isFunction( fn ) ) {            return undefined;        }        // Simulated bind        args = core_slice.call( arguments, 2 );        proxy = function() {            return fn.apply( context, args.concat( core_slice.call( arguments ) ) );        };        // Set the guid of unique handler to the same of original handler, so it can be removed        proxy.guid = fn.guid = fn.guid || jQuery.guid++;        return proxy;    },    ...............});

 

jquery工具方法proxy

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.