2014-01-23 70 views
1

我經常使用這樣的結構:將變量傳遞給JavaScript函數的上下文

var $this, url, callback; //some private vars 
loadCallback = function($that, url, callback) { 
    return function(responseText, textStatus, req) { 
     ... 
    }; 
})($this, url, callback) 

然而,是不是很舒服。有其他選擇嗎?
我已經看過jQuery.proxy,但該函數似乎修復了「this」變量,因此loadCallback無法調用應用另一個「this」上下文。

+0

還有其他方法可以做到這一點,但他們通常都會做同樣的事情。您可以更改上下文,傳遞其他參數,也可以將其存儲在父範圍(或子範圍有權訪問的任何範圍)中 –

回答

2

在現代瀏覽器中使用bind。實現自己的簡單的版本是這樣的:

function bind(fn, _this) { 
    var _args = Array.prototype.slice.call(arguments, 2); 
    return function() { 
     return fn.apply(_this, _args.concat(Array.prototype.slice.call(arguments))); 
    } 
} 

用法:

var loadCallback = bind(function(url, responseText, textStatus, req) { 
    console.log(url, responseText) 
}, this, url); 

更完整polyfill can be found on MDN

+0

支持哪些瀏覽器? – Merion

+0

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind#Browser_compatibility –