Your problem is a problem of concept, this refers to the area that uses it, for example, in your case this exists only in the scope of each function, I explain:
cantidad = 14;
nItemCart= 14;
interval=[];
restarCantidad(cantidad, nItemCart){
if (cantidad > 0) {
cantidad--;
this.nItemCart--; //*** Aquí estas usando this para referirte al ambito de la funcion "restarCantidad" hasta el momento todo correcto
console.log("estoy restando", cantidad, this.nItemCart); // en esta linea si reconoce la variable
this.interval.push(setInterval(function (nItemCart) {
if (cantidad > 0) {
cantidad--;
//Como ves, la funcion "this.interval.pus" usa un "callback" que es una función anonima,
//es decir otra función. por lo tanto tiene un ambito propio, esto quiere decir que cuando usas "this" aquí dentro, solo usa el ambito de la función. por eso "this.nItemCart" es diferente al que usas arriba.
console.log(nItemCart, this.nItemCart);
nItemCart--;
console.log("estoy restando", cantidad, nItemCart, this.nItemCart); // en esta otra linea tampoco reconoce la variable
}
}, 150));
}
this.restarCantidad(this.cantidad, this.nItemCart);
I'll explain it to you with a simpler example.
// función sencilla que recibe una variable a
function funcion1(a){
// Declaras una variable dentro de la función.
let variable = 10;
// imprimo el valor de la variable, en este caso "this" hace referencia al ambito de la función "funcion1";
console.log(this.variable); //Imprime 10
setTimeout(function(){
let variable = 30;
// imprimo el valor de la variable, en este caso "this" hace referencia al ambito de la función anónima del "SetTimeout"
console.log(this.variable); //imprime 30;
},1000);
// otra forma para poder enteder mejor, cuando se llama a funcion2 se crea un ambito solo para esa funcion y es la que usa el "this":
setTimeout(funcion2 ,1000);
}
// funcion sencilla que se llama desde el "setTimeout"
function funcion2(){
let variable = 50;
// imprimo el valor de la variable, en este caso "this" hace referencia al ambito de la función funcion2
console.log(this.variable); //imprime 50;
}
Now I propose the way you could work:
//Aquí estas declarando las variables de forma global (a menos que este código esté dentro de alguna funcion o clase);
// Esto queire decir que se puede acceder a estas variables desde caulquier función.
cantidad = 14;
nItemCart= 14;
interval=[];
// Según entiendo, intentas modificar las variables definidas arriba, por eso no creo necesario que las pases como parametro
// Ya que como expliqué arriba se pueden acceder desde cualquier función.
function restarCantidad(){
if (cantidad > 0) {
cantidad--;
// no necesitamos usar el "this";
nItemCart--;
console.log("estoy restando", cantidad, nItemCart); // No usamos el "this"
interval.push(setInterval(function () { // no recibe parametros
if (cantidad > 0) {
cantidad--;
console.log(nItemCart, nItemCart); //No usamos el "this"
nItemCart--;
console.log("estoy restando", cantidad, nItemCart, nItemCart); // sin el "this";
}
}, 1500));
}
}
// LLalamos la funcion sin parametros.
this.restarCantidad();
If you want to understand a little more about the context of the functions, I leave you some documentation
so that you put it into practice
link