Доступ к переменным JavaScript из вызывающей области - PullRequest
4 голосов
/ 03 августа 2009

Я пытаюсь определить функцию, которая может обращаться к переменным, которые находятся в области действия вызывающей ее функции.

(Я пытаюсь создать форматировщик строки, который красивее, чем «a» + b, и более краткий, чем String.format («a {0}», b). Поэтому я могу получить SF («a {b») } "), и я не знаю, возможно ли это)

так

function magic(str) {
    return parentScope[str]; // or return eval( str );
    // or something like that
}

function call() {
    var a = 1;
    alert( magic( "a" ) );
}
call();

выдаст предупреждение "1".

В настоящее время я могу сделать это с помощью кода возврата функции, который будет eval'd, но, похоже, должен быть лучший способ.

Ответы [ 3 ]

2 голосов
/ 03 августа 2009

Просто поместите свою «волшебную» функцию в функцию вызова:

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"
0 голосов
/ 04 августа 2009

@ Себасго прав, вы не можете делать именно то, что пытаетесь сделать. Но я подумал, что вам может понравиться метод Prototype String.interpolate :

"#{animals} on a #{transport}".interpolate({ animals: "Pigs", transport: "Surfboard" });
//-> "Pigs on a Surfboard"

var syntax = /(^|.|\r|\n)(\<%=\s*(\w+)\s*%\>)/; //matches symbols like '<%= field %>'
var html = '<div>Name: <b><%= name %></b>, Age: <b><%=age%></b></div>';
html.interpolate({ name: 'John Smith', age: 26 }, syntax);
// -> <div>Name: <b>John Smith</b>, Age: <b>26</b></div>
0 голосов
/ 03 августа 2009

Насколько я знаю, невозможно достать и взять произвольную переменную из функции в javascript. От объекта да, но не от исполняющего метода.

Я не могу придумать ни одного метода функции (применить, вызвать, иначе), который вам здесь помогает: честно говоря, я думаю, что вы слишком стараетесь, чтобы получить небольшую выгоду по сравнению с обычным форматом string.format, er ....

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...