Вам нужны операторы # и ## и автоматическая конкатенация строк.
Оператор предварительной обработки # превращает параметр макроса в строку. Оператор ## вставляет два токена (например, макропараметры) вместе.
Мне приходит в голову возможность
#define IV_DOMAIN domain.org
#define IV_SECURE(DOMAIN) "secure." #DOMAIN
, которая должна изменить значение IV_SECURE на
#define IV_SECURE "secure." "domain.org"
, которое автоматически объединится в «secure.domain.org» (при условии, что фазы перевода в Си такие же, как и в С ++).
ДРУГОЕ РЕДАКТИРОВАНИЕ: Пожалуйста, прочитайте комментарии, которые показывают, как мне удалось запутаться. Имейте в виду, что я полностью опытен в Си, хотя, возможно, немного ржавый. Я бы удалил этот ответ, но я решил оставить его как пример того, как легко быть запутанным препроцессором Си.
The solution is the binding of variables through closure.
As a more basic example, here is an example function that receives and calls a callback function, as well as an example callback function:
function callbackReceiver(callback) {
callback("Hello World");
}
function callback(value1, value2) {
console.log(value1, value2);
}
This calls the callback and supplies a single argument. Now you want to supply an additional argument, so you wrap the callback in closure.
callbackReceiver(callback); // "Hello World", undefined
callbackReceiver(function(value) {
callback(value, "Foo Bar"); // "Hello World", "Foo Bar"
});
Or, more simply using ES6 Arrow Functions:
callbackReceiver(value => callback(value, "Foo Bar")); // "Hello World", "Foo Bar"
As for your specific example, I haven't used the .post
function in jQuery, but a quick scan of the documentation suggests the call back should be a function pointer with the following signature:
function callBack(data, textStatus, jqXHR) {};
Therefore I think the solution is as follows:
var doSomething = function(extraStuff) {
return function(data, textStatus, jqXHR) {
// do something with extraStuff
};
};
var clicked = function() {
var extraStuff = {
myParam1: 'foo',
myParam2: 'bar'
}; // an object / whatever extra params you wish to pass.
$.post("someurl.php", someData, doSomething(extraStuff), "json");
};
What is happening?
In the last line, doSomething(extraStuff)
is invoked and the result of that invocation is a function pointer.
Because extraStuff
is passed as an argument to doSomething
it is within scope of the doSomething
function.
When extraStuff
is referenced in the returned anonymous inner function of doSomething
it is bound by closure to the outer function's extraStuff
argument. This is true even after doSomething
has returned.
I haven't tested the above, but I've written very similar code in the last 24 hours and it works as I've described.
You can of course pass multiple variables instead of a single 'extraStuff' object depending on your personal preference/coding standards.
на самом деле ваш код не работает, потому что, когда вы пишете:
$.post("someurl.php",someData,doSomething(data, myDiv),"json");
, вы помещаете вызов функции в качестве третьего параметра, а не ссылку на функцию .
Вы можете использовать закрытие JavaScript:
function wrapper( var1, var2,....) // put here your variables
{
return function( data, status)
{
//Handle here results of call
}
};
, а когда можете:
$.post("someurl.php",data,wrapper(var1, var2, etc...),"html");
Вы также можете попробовать что-то вроде следующего:
function clicked() {
var myDiv = $("#my-div");
$.post("someurl.php",someData,function(data){
doSomething(data, myDiv);
},"json");
}
function doSomething(curData, curDiv) {
}
При использовании doSomething (data, myDiv)
вы фактически вызываете функцию и не делаете на нее ссылки.
Вы можете передать doStomething
напрямую, но вы должны убедиться, что у нее правильная подпись.
Если вы хотите сохранить doSomething таким, какой он есть, вы можете заключить его вызов в анонимную функцию.
function clicked() {
var myDiv = $("#my-div");
$.post("someurl.php",someData, function(data){
doSomething(data, myDiv)
},"json");
}
function doSomething(curData, curDiv) {
...
}
Внутри кода анонимной функции вы может использовать переменные, определенные во включающей области. Так работает область видимости Javascript.