0

我需要知道我做错了什么,因为我无法调用内部函数显示或隐藏?

(function()
{
    var Fresh = {
        notify:function()
        {
            var timeout = 20000;
            $("#notify-container div").get(0).id.substr(7,1) == "1" && (show(),setTimeout(hide(),timeout));
            var show = function ()
            {
                $("body").animate({marginTop: "2.5em"}, "fast", "linear");
                $("#notify-container div:eq(0)").fadeIn("slow");
            },
            hide = function()
            {
               $("#notify-container div").hide();
            }
        }//END notify
    }
    window.Fresh = Fresh;
})();
Fresh.notify();

谢谢,理查德

4

5 回答 5

3

更新

如果您希望能够执行以下操作: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)

于 2012-09-14T09:36:13.777 回答
2

您必须先定义显示和隐藏,还要按照他们所说的更改 hide() 。结果将是这样的:

(function()
{
    var Fresh = {
        notify:function()
        {
            var show = function()
            {
                $("body").animate({marginTop: "2.5em"}, "fast", "linear");
                $("#notify-container div:eq(0)").fadeIn("slow");
            },
            hide = function()
            {
               $("#notify-container div").hide();
            },
            timeout = 20000;
            $("#notify-container div").get(0).id.substr(7,1) == "1" && ( show(), setTimeout(hide,timeout) );

        }//END notify
    }
    window.Fresh = Fresh;
})();
Fresh.notify();
于 2012-09-14T09:36:13.627 回答
2

首先,您尝试使用show尚未定义的值(尽管show该范围内确实存在变量):

function test() {
  show(); // TypeError: show is not a function
  var show = function() { console.log(42); };
}

它很容易通过移动var show线在它被调用的点上方修复:

function test() {
  var show = function() { console.log(42); };
  show();
}
test(); // 42

...或者如果您以更“传统”的方式(使用function show() { ... }符号)定义函数。

function test() {
  show();
  function show() { console.log(42); };
}
test(); // 42

其次,您应该改用它:

... && (show(), setTimeout(hide, timeout) );

...因为它是函数名,而不是函数结果,应该setTimeout作为第一个参数传递给它。

于 2012-09-14T09:19:32.043 回答
1

我认为调用显示的顺序,隐藏是问题。我已经修改了你的代码。它工作正常。请访问链接 http://jsfiddle.net/dzZe3/1/

于 2012-09-14T09:35:37.927 回答
0

(show(),setTimeout(hide(),timeout));

至少需要

(show(),setTimeout(function() {hide()},timeout)); 

或者

(show(),setTimeout(hide,timeout));    
于 2012-09-14T09:21:43.057 回答