#javascript
#javascript
Вопрос:
Я пытаюсь изучить замыкания с помощью простого javascript, следуя примеру, который я ввел ниже. Однако я получаю сообщение об ошибке «Uncaught TypeError: countMe.Increment не является функцией».
function enclosedFunction(){
var counter = 0;
var Increment = function(){
counter ;
console.log(counter);
}
return(Increment);
}
var countMe = enclosedFunction();
console.log("Count Me: ");
countMe.Increment();
Почему это происходит?
Ответ №1:
Потому что ООП в javascript работает не так.
Вы можете прочитать эту статью, чтобы получить основы, но в двух словах ваш код должен выглядеть следующим образом:
function EnclosedFunction() {
this.counter = 0;
this.increment = function() {
this.counter ;
console.log(this.counter);
}
}
var countMe = new EnclosedFunction();
console.log("Count Me: ");
countMe.increment();
Ответ №2:
Определение функции B
внутри другой функции A
не приводит к A.B
работе. Вам нужно назначить внутреннюю функцию объекту и вернуть этот объект, если вы хотите, чтобы функция была доступна как свойство объекта.
В вашем случае вы просто возвращаете функцию, назначенную countMe
, поэтому вам нужно запустить countMe()
. Если бы вы хотели countMe.Increment
работать, вам нужно было бы вернуть что-то вроде {Increment: Increment}
.
function enclosedFunction(){
var counter = 0;
var Increment = function(){
counter ;
console.log(counter);
}
return({ Increment: Increment });
}
var countMe = enclosedFunction();
console.log("Count Me: ");
countMe.Increment();
Ответ №3:
Этого не должно быть countMe
countMe.Increment()
, поскольку вы присваиваете возвращаемое значение функции countMe
function enclosedFunction(){
var counter = 0;
var Increment = function(){
counter ;
console.log(counter);
}
return(Increment);
}
var countMe = enclosedFunction();
console.log("Count Me: ");
countMe();
Если вы хотите получить доступ с точечной нотацией, вам нужно использовать object
function enclosedFunction(){
var counter = 0;
var Increment = function(){
counter ;
console.log(counter);
}
return(Increment);
}
var countMe = {}
countMe.Increment = enclosedFunction();
console.log("Count Me: ");
countMe.Increment();
Комментарии:
1. Хотя это и дает одно частичное объяснение того, почему я получаю ошибку, на самом деле это не помогает мне понять природу проблемы.
2. @D00k13H0w1tzer из этой строки должно быть понятно,
as you're assigning the return value of function to countMe
почему вы получаете ошибку при попытке доступаcountMe.Increment()
3. @D00k13H0w1tzer вы можете просто понять это следующим образом.
var countMe = func()
итак, теперьcountMe
хранится возвращаемое значениеfunc
, в вашем случае это функция. теперь к нему можно получить доступcountMe
, он не присваивает значениеcountMe.returnvalue
Ответ №4:
Вы возвращаетесь Increment
из enclosedFunction
— так что просто вызовите результат:
function enclosedFunction(){
var counter = 0;
var Increment = function(){
counter ;
console.log(counter);
}
return(Increment);
}
var countMe = enclosedFunction();
console.log("Count Me: ");
countMe();