2014-01-23 5 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, но эти функции, похоже, исправляют «эту» переменную, поэтому loadCallback не может быть вызван с применением другого «этого» контекста.

+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 –

Смежные вопросы