变量范围:this.remove不是函数

this.remove()不是函数。 怎么会?

var vehicle = function () { return { init: function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); this.remove(); }); }, remove: function () { alert('test'); } } }(); jQuery().ready(vehicle.init); 

对困惑感到抱歉。 我正在尝试调用自己的“删除”function。 这只是一个管理我页面上的车辆的类。 这是它的开始,它将具有比init / remove更多的function。

既然你说你试图调用自己的remove函数,这里是如何做到的:

 var vehicle = (function () { return { init: function () { var that = this; // step one jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); that.remove(); }); }, remove: function () { alert('test'); } } }()); // step zero - wrap the immediate invocation in parens jQuery(function () { vehicle.init(); // step two ); 

this是一个DOM元素。 要使用jQuery的.remove()方法,需要将其包装在jQuery对象中。

 $(this).remove(); 

编辑:如果您希望调用vehicle对象中的remove()函数,则调用:

 vehicle.remove(); 

此外,如果您希望缩短.ready()调用,则可以执行以下操作:

 jQuery(vehicle.init); 

从jQuery 1.4发行说明 :

jQuery().ready()技术仍然适用于1.4,但它已被弃用。 请使用jQuery(document).ready()jQuery(function(){})

也许你正在寻找这样的东西?

 var vehicle = new function () { var self = this; this.init = function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); self.remove(); }); }; this.remove = function () { alert('test'); }; }; 

……或者喜欢这样吗? 要告诉你的目标很难……

 var vehicle = new function () { function remove () { alert('test'); } this.init = function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); remove.call(this); }); }; }; 

注意 – 我们都有些困惑,因为你不清楚要调用哪个“删除”function。

问题是你传递了对“init”函数的引用,但是当它被调用时,“this”变量将引用window对象,而不是“vehicle”的值。 为什么? 因为在Javascript中,“this”值仅取决于函数的调用方式。 在同一个对象中定义两个函数的事实与它完全无关。

尝试这样做:

 jQuery(function() { vehicle.init(); }); 

当你以这种方式调用“init”函数时 – 通过显式地将其作为“vehicle”对象的属性引用 – 然后Javascript将“this”绑定到“vehicle”的值。

编辑哦等等我只是注意到你将不得不修改你的“init”函数,因为“click”处理程序中的代码将由jQuery调用,以便将“this”绑定在受影响元素的上下文。 因此,如果你想保持“车辆”参考,你会这样做:

  init: function () { var originalThis = this; jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); originalThis.remove(); }); }, 
 var vehicle = function () { return { init: function () { var self = this; jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); self.remove(); }); }, remove: function () { alert('test'); } } }(); jQuery().ready(function() { vehicle.init(); }); 

当调用函数作为方法时,“this”指的是调用它的对象。 在jQuery中,传递的函数被调用为html元素的方法,因此“this”成为元素。

要确保引用正确的对象,您需要创建对原始对象的引用。

  var vehicle = function () { var that = { init: function () { jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { e.preventDefault(); that.remove(); }); }, remove: function () { alert('test'); } } return that; }(); jQuery().ready(vehicle.init);