Похоже, здесь есть несколько проблем:
Проблема 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