更新
如果您希望能够执行以下操作:Fresh.notify.showMessage()
,您需要做的就是为函数分配一个属性notify
:
var Fresh = {notify:function(){return 'notify called';}};
Fresh.notify.showMessage = function () { return this() + ' and showMessage, too!';};
Fresh.notify();//notify called
Fresh.notify.showMessage();//notify called and showMessage, too!
这将指向这里的函数对象,并且可以这样调用(this()
=== Fresh.notify();
)。仅此而已。
这段代码有很多问题。首先:您尝试使用闭包真是太好了。但是,如果您不介意我的话,您并没有充分利用它们。例如:该notify
方法包含函数声明和 jQuery 选择器。这意味着每次调用该方法时,都会创建新的函数对象,并且选择器将导致一次又一次地搜索 dom。最好只保留闭包范围内引用的函数和 dom 元素:
(function()
{
var body = $("body");
var notifyDiv = $("#notify-container div")[0];
var notifyDivEq0 = $("#notify-container div:eq(0)");
var show = function ()
{
body.animate({marginTop: "2.5em"}, "fast", "linear");
notifyDivEq0.fadeIn("slow");
};
var hide = function()
{//notifyDiv is not a jQ object, just pass it to jQ again:
$(notifyDiv).hide();
};
var timeout = 20000;
var Fresh = {
notify:function()
{
//this doesn't really make sense to me...
//notifyDiv.id.substr(7,1) == "1" && (show(),setTimeout(hide,timeout));
//I think this is what you want:
if (notifyDiv.id.charAt(6) === '1')
{
show();
setTimeout(hide,timeout);//pass function reference
//setTimeout(hide(),timeout); calls return value of hide, which is undefined here
}
}//END notify
}
window.Fresh = Fresh;
})();
Fresh.notify();
在这种情况下很难提出建议,因为就其本身而言,这段代码并没有多大意义。我建议你设置一个小提琴,这样我们就可以看到代码在工作(或者看到代码失败:P)