Почему моя внутренняя функция вызывает «Uncaught TypeError: countMe.Инкремент не является функцией» в обычном javascript?

#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();