2010-09-20 74 views
5

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

对不起,我感到困惑。我试图调用我自己的“删除”功能。这只是一个管理我的页面上的车辆的课程。这是它的开始,它将比只是init/remove有更多的功能。

+2

您是否想调用jQuery的remove方法来移除DOM元素或提醒'test'的自定义事件? – Harmen 2010-09-20 18:33:26

回答

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

它的工作原理,谢谢! – Webnet 2010-09-20 19:08:24

+1

它没有包装在()中,所以为什么呢? – Webnet 2010-09-20 19:21:29

+0

这与@ Pointy的回答有什么不同吗?另外,为什么将函数包装在'()'中?如果你只是将返回值赋给一个变量,它将以任何方式工作。 – user113716 2010-09-20 19:24:54

5

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

$(this).remove(); 

编辑:如果你希望来调用vehicle对象remove()函数,然后调用:

vehicle.remove(); 

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

jQuery(vehicle.init); 

jQuery 1.4 release notes

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

+0

嗯,我不认为这是问题 - 他想在那里的对象字面值中调用“删除”函数。 – Pointy 2010-09-20 18:33:20

+0

我试图调用我自己的删除函数 – Webnet 2010-09-20 18:56:31

+1

@Webnet - 如果需要,你可以直接调用'vehicle.remove',或者你可以使用@ Pointy的答案在'init'函数中保留'this'的值,但无论如何,在事件处理程序中,this将引用接收事件的DOM元素。 – user113716 2010-09-20 19:00:40

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

我认为这不会起作用。 – Pointy 2010-09-20 18:34:48

+0

当然这不起作用,'self'指向init函数 – Harmen 2010-09-20 18:36:09

+1

不,@Harmen,“self”不会指向“init”函数,它会指向该函数的“this”值叫做。这里的问题是“准备就绪”的设置仍然是错误的。 – Pointy 2010-09-20 18:39:55

2

注意 - 我们都有点困惑,因为目前还不清楚其中“删除”你要调用函数。

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

尽量不要做这样的:

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

当你调用“初始化”功能,通过明确地引用它作为“车辆”的属性的方式—对象—然后用JavaScript绑定“本”的“车辆”的价值。

编辑哦,等等我只注意到你将不得不修改你的“初始化”功能,因为这里面的代码“点击”处理器将是jQuery的通过以这样的方式被称为把这个“这个”绑定到受影响的元素。因此,如果你想保持“车辆”的参考,你应该这样做:

init: function() { 
     var originalThis = this; 
     jQuery('.vehicle-year-profile .options .delete').bind('click', function (e) { 
      e.preventDefault(); 
      originalThis.remove(); 
     }); 
    }, 
+0

尖尖 - 我认为这是不对的。 'vehicle'是一个自我执行的函数,它返回一个具有属性'init'的对象,这是一个函数,所以'jQuery().ready(vehicle.init);'将引用传递给init函数在'ready()'中使用。 – user113716 2010-09-20 18:38:59

+1

是的,我看到@patrick,但我认为(当然猜测)他想要的是在同一个对象中调用“remove”函数,而不是jQuery“remove”。 – Pointy 2010-09-20 18:40:43

+1

'this'绑定到元素,而不是窗口,因为它在用于事件侦听器的函数中使用。他必须结合这一点和I.devries解决方案才能发挥作用。 – 2010-09-20 18:41:44

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

}; 
+0

为什么'新功能'? – Harmen 2010-09-20 18:41:03

+1

所以它内部的'this'将引用'new'构造的对象。 – 2010-09-20 18:44:31

+0

不要使用var foo = new function(){...};'。使用'变种富=函数(){...};'或'只是函数foo(){...};' – 2010-09-20 18:52:14

0

当调用一个函数的方法“这个”指的是物体调用它。在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);