我一定错过了什么。jQuery插件教程在这里找到,在"命名空间"->"插件方法"一节中,隐藏着下面的插件声明。我在这里没有得到的是方法变量的范围;我的意思是,不应该方法被定义为工具提示中的变量吗?一旦这个匿名函数执行,如果我理解正确的话,方法将超出作用域,因为它被定义为函数中的var。当tooltip被调用时,它是如何引用超出作用域的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 );
分配给$.fn.tooltip
的函数是闭包[Wikipedia]因此可以访问所有更高的作用域。
当外部函数返回时,methods
不会被销毁,因为闭包仍然引用它
它不会超出作用域,因为你的插件仍然保存着对它的引用。在JS中,它们被称为闭包。
这一切都是因为闭包。$.fn.tooltip
指向的函数实际上是一个闭包。所以它可以访问method
对象