Следующие function once
(проблема 13) принимает func
и возвращает функцию, которая позволяет вызывать только один раз func
.Закрытие в JavaScript и выполнение функции один раз
function add(a, b) {
return a + b;
}
function once(func) {
return function() {
var f = func;
func = null;
return f.apply(this, arguments);
};
}
add_once = once(add);
add_once(3, 4) // 7
add_once(3, 4) // throws
Есть две вещи, о которых я не понимаю.
- Почему запись
func = null
не позволяет нам снова вызвать функцию? После сохранения указателя на функцию (все правильно использовать C lingo, не так ли?) Вvar f = func
, я ожидаю, что назначениеnull
на указатель функцииfunc
(func
- это просто указатель на функцию; ?) не имеет значения, поскольку функция (указатель на) уже сохранена вf
. Что мне не хватает? - Я получаю, что это necessary, чтобы написать
f.apply(this, arguments);
, а не простоf(arguments);
, потому что это один из особенностей JavaScript. Последний отправил в функцию массив, а не список аргументов. Но я не понимаю, к чему относитсяthis
. Это относится к анонимной функции во второй строке или кonce
? И если назначениеfunc = null
предназначено для остановки второго вызова, потому что закрытие приведет кfunc
, который был обнулен, почему он работает в первый раз, когда он называется?
Я использую слишком много вопросов, чтобы дать вам возможность идентифицировать то, что мне не хватает, а не с ожиданием, что вы наберете длинный ответ, решающий каждый подзапрос самостоятельно.
То, как вы его вызываете, 'this' будет глобальным объектом или' undefined', если в строгом режиме. –
для вашего вопроса 1: mistery - это ключевое слово "var". когда вы определяете переменную с «var», это означает игнорирование всех одинаковых значений переменной в текущей или родительской области и использование вновь назначенного значения для текущей области. поэтому второй вызов var f = func вызовет f = null. –
@Tolgahan: код будет работать точно так же без 'var'. –