Просто поместите свою «волшебную» функцию в функцию вызова:
function call() {
function magic(str) {
return a;
}
var a = 1;
alert( magic() );
}
call();
Этот скрытый механизм называется замыкания и является очень мощной концепцией. Подумайте только об AJAX-запросе, в котором функция обратного вызова все еще может обращаться к локальным переменным вызывающей функции.
UPDATE
Я неправильно понял ваш вопрос. То, что вы на самом деле хотите построить, невозможно реализовать в JavaScript, потому что нет способа получить доступ к области действия вызывающего.
ОБНОВЛЕНИЕ 2
Вот моя функция форматирования строки. Не так лаконично, как хотелось бы, но все же очень удобно.
String.prototype.arg = function()
{
result = this;
// This depends on mootools, a normal for loop would do the job, too
$A(arguments).each((function(arg)
{
result = result.replace("%", arg);
}).bind(this));
return result;
}
Вы можете использовать его как:
"%-% %".arg(1,2).arg(3)
и получите
"1-2 3"