2012-01-07 2 views
0

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

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

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

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

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

+1

Наибольшая переменная, определенная как аргумент функции, существует только в области функции между скобками. Только _функция (самая лучшая, все) _ {'here'} –

ответ

2

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

Выпуск 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 
2

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

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

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

var thebest = 0; 
ec.get("id", function(theNewBest,all) { theBest = 'new value' }); 
alert(thebest); 
Смежные вопросы