Сегодня при написании кода с использованием подчеркивания и магистрали мне пришлось обернуть некоторые функции. Я видел следующий пример на underscorejs.org
var hello = function (name) {return "hello:" + name; };
hello = _.wrap (привет, функция (func) {
вернуть «до» + func («мо») + «после»;
});
Привет();
=> 'до, привет: мо, после'
на второй последней строке
что, если вызов функции похож на
привет ("умар");
Я хочу сказать, что аргументы приходят извне.
Обертка уже позаботится об этом за вас. Исходный код для переноса довольно короткий для чтения. Это или вы можете взглянуть на расширенный пример ниже:
var greet = function(name, language){
var response
if (language === "sp") {
response = "Hola"
} else if (language === "fr") {
response = "Bonjour"
} else {
response = "Hello"
}
return response + " " + name
}
greet("Ted", "fr"); // => "Bonjour Ted"
greet = _.wrap(greet, function(old_greet, lang){ return old_greet("Ted", lang); } );
greet("sp"); // => "Hola Ted"
Спасибо за такой быстрый ответ. Это было очень полезно.
Я использую магистраль для разработки корпоративного приложения.
view.js
var view = Backbone.View.extend ({
authorizeCreateAction: function () {
// здесь "это" указывает на просмотр
this.createAlert: _.wrap (this.createAlert, function (_createAlert, _type) {
// авторизуем действие create
return _createAlert (_type);
});
},
createAlert: function (type) {
//ПРОБЛЕМА:
// Здесь "this" указывает на [window global]
}
});
см. внутри функции createAlert, когда я напрямую вызывал функцию createAlert, она указала на просмотр, но когда я написал функцию-оболочку, она начала указывать на [window global]
Я хочу изменить ссылку на это, чтобы указывать на "вид"
Я новичок, чтобы подчеркнуть, пожалуйста, игнорируйте, если вопрос не имеет отношения к делу.
Кстати, подчеркивание - это здорово
Вам нужно будет вызвать _createAlert
с контекстом, как показано ниже. Надеюсь, это поможет. :)
return _createAlert.call(this, _type);
кажется, что подчеркивание _wrap поддерживает только один параметр, используйте вместо этого:
fn = (function (fn, before, after, self) {
return function () {
если (до) before.apply (self, arguments);
var res = fn.apply (self, arguments);
если (после) after.apply (self, arguments);
return res;
}
}) (fn, до, после, это)
Вы также можете использовать партиал для этого zarehb
tnx megawac, partial больше для предварительного заполнения аргументов, не вызывая функции до и после
Перенос осуществляется через _.partial
fyi
fn = _.partial(function(fn, before, after, self) {
var args = _.rest(arguments, 4);
if (before) before.apply(self,args);
var res = fn.apply(self,args);
if (after) after.apply(self,args);
return res;
})(fn, before, after, this )
это правильно, и это будет работать, но если кому-то нужно чистое js-решение, можно взять мое специально, что использование подчеркивания не дает вам никакой выгоды в этом случае!