在这里,我刚刚提取了我有问题的代码部分,因为它是带有clickInfo方法的对象,当单击html中的testDivbtn时我想使用该对象

var product = {
        jsondata:[
        {title:"GearBox", price:80000},
        {title:"Clutch", price:7000}
        ],
    loadInfo:function (event) {
    ​   // This line is printing first product info from the jsondata array​ - just to test
     console.log (this.jsondata[0].title + " " + this.jsondata[0].price);
      }
}


这是附加到点击处理程序的简单div

$ ("#testDivbtn").click(product.loadInfo);


这是html

<div class="col-sm6"><button id="#testDivbtn" type="button" class="btn btn-default">Test Product</button></div>


它在控制台中显示错误-无法读取未定义的属性“ 0”
我在我的应用程序中的许多其他地方都存在此错误,如果有任何错误,这将非常有帮助。

最佳答案

在这里,您需要了解一些与正确使用“ this”对象有关的概念。一些方法,例如bind()-(从ES5开始),apply()和call()。
  现在,如我所见,您的代码将
  尝试详细解释一下
  
  
    这里的按钮$(“#testDivbtn”)本身就是一个对象,您将product.loadInfo方法传递给它的click()方法作为回调,因为它位于product.loadInfo方法内部,不再引用产品对象。现在,“ this”将指向product.loadInfo所在的对象
     方法被执行,因为这是在该方法中定义的。
     调用product.loadInfo的对象是按钮对象,product.loadInfo将在按钮对象的click方法中执行。
  


即使您使用product.loadInfo()调用loadInfo()方法
在这一点上,很明显,当上下文改变时,当我们在对象最初定义的位置以外的其他对象上执行方法时,


  “ this”关键字不再引用最初定义“ this”的原始对象,而是现在引用调用该方法的对象。
  
  
    将方法作为回调函数传递时解决此问题的解决方案:
    由于您确实希望this.jsondata引用产品对象上的jsondata属性,因此我们可以使用Bind(),Apply()或Call()方法专门设置this的值。
  


如上答案建议使用绑定替换这样的所有地方

    $("#testDivbtn").click (product.loadInfo);


有了这个

    $("#testDivbtn").click (product.loadInfo.bind (product)); // it will print Gearbox 80000 in console.


我要链接的一个问题是,在此处查找有关应用调用绑定的更多详细信息确实非常好
Javascript call() & apply() vs bind()?

07-24 18:14