Доступ к переменной внутри функции метода в JavaScript - PullRequest
0 голосов
/ 07 января 2012

Я новичок в JavaScript, поэтому, пожалуйста, прости любую неправильную терминологию / понимание.

Я пытаюсь извлечь переменную thebest из функции обратного вызова function(thebest,all) в методе ec.get.

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

var thebest = 0;
ec.get("id", function(thebest,all) { });
alert(thebest);

Я также пытался использовать другое имя переменной снаружи, но это не имело никакого значения.Как я могу получить доступ к значению самой внутренней переменной thebest снаружи метода и его функции?Спасибо!

Ответы [ 3 ]

2 голосов
/ 07 января 2012

Если обратный вызов является чем-то, что выполняется быстро (не асинхронно), тогда вы можете просто назначить его переменной с другим именем. Например

var theBest = 0;
ec.get("id", function(theBestArg,all) { theBest = theBestArg; });
alert(thebest);
2 голосов
/ 07 января 2012

Ваша проблема в том, что вы перераспределяете theBest в качестве аргумента для своей функции.

var thebest = 0;
ec.get("id", function(theNewBest,all) { theBest = 'new value' });
alert(thebest);
2 голосов
/ 07 января 2012

Похоже, здесь есть несколько проблем:

Проблема 1: Если вы хотите изменить значение theBest в функции обратного вызова, вы не можете изменить его, передав его в качестве параметра. Простые переменные передаются по значению, поэтому оригинал не изменяется, если вы измените его в функции.

Проблема 2: Предполагая, что ec.get() является сетевой операцией, она, вероятно, асинхронная, что означает, что передаваемая вами функция обратного вызова не вызывается намного позже. Это означает, что функция обратного вызова завершения не будет выполнена, когда сработает ваше оповещение. Так что это еще ничего не изменит.

Проблема 3: Вы не можете передать аргументы обратному вызову так, как вы его объявили. Это определит эти аргументы, но если ec.get() не будет передавать аргументы просто так, аргументы фактически не будут присутствовать при его вызове. Помните, что ec.get() вызывает вашу функцию внутри страны. Он сам решает, какие аргументы получает ваш обратный вызов. Вы не можете это изменить.

Проблема 4: Когда вы объявляете аргумент для вашей функции с тем же именем, что и локальная или глобальная переменная (thebest в вашем примере), вы создаете конфликт имен, который заставляет аргумент принимать над этим именем для области вашей функции и сделать переменную более высокого уровня недоступной. В общем, плохая идея называть аргумент функции тем же именем, что и любая другая переменная в области видимости. Он просто просит вас или других людей, читающих ваш код, запутаться и сделать неверные предположения о том, что изменяется или читается при использовании этого имени.

Один из способов сделать это заключается в следующем:

var thebest = 0;
var all = "whatever";
ec.get("id", function() {
    // use the arguments "thebest" and "all" here which are available 
    // from the higher scope.  They don't need to be passed in
    alert(thebest);
    alert(all);
});
// you can't alert on the value of thebest and all here because 
// an asychronous callback won't have yet been called and 
// won't have yet modified those values
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...