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

时间:2010-09-20 18:25:40

标签: javascript jquery

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

很抱歉这个混乱。我正在尝试调用自己的“删除”功能。这只是一个管理我页面上的车辆的类。这是它的开始,它将具有比init / remove更多的功能。

6 个答案:

答案 0 :(得分:5)

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

$(this).remove();

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

vehicle.remove();

另外,如果您希望缩短.ready()来电,可以这样做:

jQuery(vehicle.init);

来自jQuery 1.4 release notes

  

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

答案 1 :(得分:2)

注意 - 我们都有点困惑,因为您不清楚要调用哪个“删除”功能。

问题是你传入了对“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();
        });
    },

答案 2 :(得分:2)

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

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);
    });
  };

};

答案 3 :(得分:0)

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

答案 4 :(得分:0)

既然您说过要尝试调用自己的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
);

答案 5 :(得分:0)

当调用函数作为方法时,“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);