Использование Firebug и jsfiddle.net для проверки функции - PullRequest
1 голос
/ 15 апреля 2011

Я начинающий программист, получивший приведенную ниже функцию из объектно-ориентированной книги JavaScript Стояна Стефанова. Он говорит, что если вы позвоните следующим три раза, он выведет «a» и «b», а затем «c». Когда я пробовал это в консоли firebug, он продолжал давать мне «а», так что это один вопрос (а), то есть есть ли что-то в firebug, что объяснило бы мой результат?

Далее я попытался запустить его в jsfiddle.net, но ничего не получилось. http://jsfiddle.net/mjmitche/SkSMm/

Я m sure I делаю что-то не так, но что? Пожалуйста, объясните, если можете. Обратите внимание, я сделал следующее (); и получил A, а затем я сделал следующее (); снова и получил «а» и следующий (); снова и получил «а». Другими словами, счетчик не запомнил t change or didn.

function setup(x) {
   var i = 0;
   return function () {
        return x[i++];
    };
}

var next = setup(['a','b','c']);

next();

Ответы [ 4 ]

1 голос
/ 15 апреля 2011

Вот ссылка jsfiddle, чтобы показать, что она работает:

http://jsfiddle.net/ZnZTk/

1 голос
/ 15 апреля 2011

JsFiddle не похож на консоль, у него нет окна, в котором он будет выводить возвращаемые значения. Результатом кода является веб-страница, которая отображается в правом нижнем углу.

Вы можете использовать метод alert для отображения значений:

alert(next());

http://jsfiddle.net/SkSMm/4/

Как видите, вызов next три раза фактически выведет три значения в массиве. Функция setup возвращает делегата для анонимной функции, созданной в функции. Поскольку эта анонимная функция использует переменные вне себя, но которые являются локальными для окружающей функции, для функции создается замыкание. Замыкание будет содержать переменные i и x. Поскольку замыкание принадлежит делегату, оно выживет от одного вызова функции до следующего и сохранит значения своих переменных.

Вы можете сделать подобное, просто используя глобальные переменные:

var x = ['a','b','c'];
var i = 0;

function next() {
  return x[i++];
}

alert(next());
alert(next());
alert(next());

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

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

0 голосов
/ 15 апреля 2011

Вот аккуратная демонстрация, которая использует импортированную say функцию и использует кнопку:

http://jsfiddle.net/entropo/wxTqR/

Это отличный способ протестировать ваши сценарии, не полагаясь на журнал или оповещения.

Функция say взята из jQuery в действии. Выдержки:

В рамках этой функции мы используем услуги небольшой вспомогательной функции, скажем, () C, что мы используем для отправки текстовых сообщений в динамически создаваемый элемент на странице что мы будем называть «консоль». Эта функция объявлена ​​в импортированной поддержке файл сценария (jqia2.support.js), и он избавит нас от необходимости использовать раздражающие и разрушительные оповещения, чтобы указать, когда что-то происходит на нашей странице. Мы будем использовать эту удобную функцию во многих примерах в оставшейся части книги.
0 голосов
/ 15 апреля 2011

Вы сделали это неправильно: enter image description here

И jsfiddle: http://jsfiddle.net/ZHgW2/

...