JS:为什么在一个对象的方法内部声明var并作为参数传递给同一对象的另一个方法时没有声明var?

JS: why is the var not declared when it is declared inside a method of an object and passed as a parameter to the other method of the same object?

当变量在一个对象的方法内声明并作为参数传递给同一对象的另一个方法时,我不知道为什么会出现错误 "ReferenceError i is not declared"。

这是我的 JS:

var reservasAPP = {   
    generarGrilla: function(){
        //la llamo desde el html con jQuery(document).ready();
        for(var i=1; i<13; i++){
            var impresionGrilla = $('#grilla').append("<button class=\"btn btn-primary btn-xs\" onclick=\"return reservasAPP.guardarReserva(i);\">Reservar</button>");
        };
    },
    nombre: function (i) {
        return $('#horario'+i).val();
    },  
    guardarReserva:function(i){
        var reservaConfirmada = $('#horario'+i).html('--> '+this.nombre());
        console.log("whatever "+i);
        console.log(i);
        return false;
    },    
}

window.reservas = reservasAPP;

如果我转到控制台并尝试获取 var 的值,我输入 "var i",我会得到 "undefined"。为什么未定义?

将您的 generarGrilla 函数替换为:

generarGrilla: function() {
    for (var i = 1; i < 13; i++){
        $('#grilla').append('<button class="btn btn-primary btn-xs">')
                    .on('click', this.guardarReserva.bind(this, i));
    }
},

上面的代码用 jQuery 注册的处理程序替换了内联 DOM0 事件处理程序。

该处理程序由 .bind 调用生成,它不仅确保使用正确的 this 调用 guardarReserva,而且还传递 i 的当前值] 作为第一个参数传递给该函数。

[ 在 guardaReserva() 中你还需要记得在调用 this.nombre() 时传递 i,即 this.nombre(i)]。

试试这个...

var reservasAPP = {   
    generarGrilla: function(){
        //la llamo desde el html con jQuery(document).ready();
        for(var i=1; i<13; i++){
            var impresionGrilla = $('#grilla').append("<button class=\"btn btn-primary btn-xs\" onclick=\"return reservasAPP.guardarReserva(" + i + ");\">Reservar</button>");
        };
    },
    nombre: function (i) {
        return $('#horario'+i).val();
    },  
    guardarReserva:function(i){
        var reservaConfirmada = $('#horario'+i).html('--> '+this.nombre(i));
        console.log("whatever "+i);
        console.log(i);
        return false;
    },    
}

说明 "<button class=\"btn btn-primary btn-xs\" onclick=\"return reservasAPP.guardarReserva(i);\">Reservar</button>" 被注入到 DOM 但变量 "i" 在那里没有意义。

此外,"nombre" 函数需要一个参数,显然应该是传递给 "guardarReserva" 函数的参数。因此更改了以下行:

var reservaConfirmada = $('#horario'+i).html('--> '+this.nombre());

var reservaConfirmada = $('#horario'+i).html('--> '+this.nombre(i));

如果你在这里尝试使用那个 i 变量:

nombre: function (i)

guardarReserva:function(i)

和我在这里声明的一样:

generarGrilla: function(){
//la llamo desde el html con jQuery(document).ready();
for(var i=1; i<13; i++){

它仅在 generarGrilla 函数的范围内定义,这就是为什么您会收到“ReferenceError i is not declared”错误的原因。