我必须遗漏一些东西。 jQuery插件教程在“命名空间”中找到了here - > “插件方法”部分,有潜伏在下面的插件声明。我没有得到的是方法变量的范围;我的意思是,不应该将方法定义为工具提示中的var吗?一旦这个匿名函数执行,如果我理解正确,方法就会超出范围,因为它被定义为函数中的var。当工具提示被调用时,工具提示如何引用将超出范围的var方法?我错过了什么?
(function( $ ){
var methods = {
init : function( options ) { // THIS },
show : function( ) { // IS },
hide : function( ) { // GOOD },
update : function( content ) { // !!! }
};
$.fn.tooltip = function( method ) {
// Method calling logic
if ( methods[method] ) {
return methods[ method ].apply( this, Array.prototype.slice.call( arguments, 1 ));
} else if ( typeof method === 'object' || ! method ) {
return methods.init.apply( this, arguments );
} else {
$.error( 'Method ' + method + ' does not exist on jQuery.tooltip' );
}
};
})( jQuery );
答案 0 :(得分:7)
分配给$.fn.tooltip
的功能是closure [Wikipedia],因此可以访问所有更高的范围。
当外部函数返回时,methods
不会被销毁,因为闭包仍然引用它。
答案 1 :(得分:1)
它不会完全超出范围,因为您的插件仍然保留对它的引用。在JS中,它们被称为closures。
答案 2 :(得分:0)
这一切都因闭合而起作用。 $.fn.tooltip
指向的函数实际上是一个闭包。因此它可以访问method
对象。