2015-10-26 3 views
0

У меня есть цикл for, где я получаю начальный номер для моего обратного отсчета. Я хочу использовать это число вне цикла for, и здесь возникает проблема закрытия.Ошибка закрытия обратного отсчета Javascript

for (var i = 0; i < response.length; i++) { 
    var number = response[i].number; //the number is 10 
    getNumber(number); 
}; 

Так я думал, что я должен вызвать функцию, которая возвращает это число, так что я могу использовать его где-нибудь еще:

function getNumber(number) { 
    return number; 
} 

Но когда я пытаюсь сделать это, я получаю неопределенный вместо 10:

var globalVariableForNumber = getNumber(); 

То, что я знаю, что я делаю неправильно звонит getNumber() без параметра при назначении значения к моей переменной, но как еще я должен сделать это?

Число исходит из вызова ajax, в котором больше номеров (отклик [i] .number). Затем я хочу использовать эти числа, чтобы быть начальными таймерами моего обратного отсчета. Поэтому, если число равно 10, тогда мой обратный отсчет начнется с 10. Спасибо.

+0

попробовать сделать это вар 'вар globalVariableForNumber = getNumber' не вызывая функцию, но назначение его, поэтому мы не просто установить возвращаемое значение в переменная. –

+0

Я не понимаю. Должен ли я определить функцию и вместо этого создать переменную и присвоить ей getNumber? Извините, но мне это почему-то не имеет смысла. – SimeriaIonut

+1

Вызов функции не сохраняет значение в ней - вы хотите извлечь одно значение из 'response' или преобразовать каждую запись в ответе в значение в ключе' number'? –

ответ

0

var response = [ 
 
    {number:5}, 
 
    {number:6}, 
 
    {number:7}, 
 
    {number:8}, 
 
    {number:9}, 
 
    {number:10} 
 
] 
 

 
var number; 
 
for (var i = 0; i < response.length; i++) { 
 
    number = response[i].number; //the number is 10 
 
    console.log(getNumber()); 
 
}; 
 
function getNumber() { 
 
    return number; 
 
} 
 

 
// try it again later... 
 
console.log(getNumber());

Опять же, вы должны быть просто номер вызывающего абонента непосредственно. Но для этого вопроса вы должны объявить number в более широком диапазоне.

enter image description here

+0

Я все еще получаю число как неопределенное – SimeriaIonut

+0

, что является результатом console.log ('response [i] .number')? – Shanimal

+0

Это 10. Когда я console.log число внутри getNumber(), я все равно получаю 10. Но когда я хочу использовать номер переменной в другом месте, он не определен. – SimeriaIonut

0

Что вы делаете, создает функцию, которая принимает ровно один параметр и возвращает этот параметр при вызове. Возвращение - причудливый способ сказать, что если вы скажете foo=bar(), то foo - это то, что возвращается bar().

В вашем коде, вызывающем getNumber() без параметров, возвращается undefined, потому что он просто возвращает параметр. То, что вы должны сделать, вместо того, чтобы не возвращать параметр, но вместо того, чтобы установить глобальную переменную к нему так:

function getNumber(number) { 
    globalVariableForNumber = number; 
} 

Теперь просто получить номер, выполнив:

globalVariableForNumber 
0

Область

Текущий контекст исполнения. Контекст, в котором значения и выражения являются «видимыми» или могут быть указаны. Если переменная или другое выражение не «находится в текущей области», тогда оно не доступно для использования. Области могут также быть разбиты на слои в иерархии, так что области имеют доступ к родительским областям, но не наоборот.

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

Рассмотрим пример областей, что ваш код может быть объявлен и называется:

function ImInGlobalScope(){ //Function declared in global scope 

//Lets call this block 1 
for (var i = 0; i < response.length; i++) { 
    var number = response[i].number; //Inside function scope 
    getNumber(number) 
}; 

//Lets call this block 2 
function getNumber(number){ //In same scope than for statement 
    return number; //block 3 
} 

} 

var globalVariableForNumber = getNumber(); 

В этом примере getNumber не определена, поскольку он принадлежит к ImInGlobalScope() области. Рассмотрим другой сценарий областей для вашего кода.

function ImInGlobalScope(){ //Function declared in global scope 

//Lets call this block 1 
for (var i = 0; i < response.length; i++) { 
    var number = response[i].number; //Inside function scope 
    getNumber(number) 
}; 

} 

//Lets call this block 2 
function getNumber(number){ //In same scope than for statement 
    return number; //block 3 
} 

var globalVariableForNumber = getNumber(); 

Я считаю, что выше, что ваш сценарий: getNumber на глобальном масштабе, но число ImInGlobalScope().

Так что, когда вы звоните var globalVariableForNumber = getNumber(); Мы имеем следующее:

function getNumber(number){ //Number is not being passed so is undefined 
    return number; //no variable named number exists in this scope so it will return undefined. 
} 
+0

Не могли бы вы [редактировать] в объяснении, почему этот код отвечает на вопрос? Кодовые ответы [обескуражены] (http://meta.stackexchange.com/q/148272/274165), потому что они не учат решению. –

Смежные вопросы