javascript - 无法访问javascript中函数内的函数

标签 javascript closures

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

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

谢谢理查德

最佳答案

更新

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

在这种情况下很难提出建议,因为就其本身而言,这段代码并没有多大意义。我建议您设置a fiddle这样我们就可以看到正在运行的代码(或者看到代码失败了:P)

关于javascript - 无法访问javascript中函数内的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12421492/

相关文章:

javascript - 未知提供者 : $animateCssProvider <- $animateCss <- $uibModalStack <- $uibModal

javascript - 在 jsrender 中链接来自不同 json 对象的数据

javascript - 如何在模板内的对象上执行函数

javascript - 如何更改 Firefox 25 的网络信息弹出窗口?

swift - objective-c block 到 swift

dictionary - groovy:安全地在映射中找到键并返回其值

rust - 可变地借用一个结构字段,同时在闭包中借用另一个

javascript - 将 js 对象的属性传递到其方法中

closures - 类型变量中的闭包特征界限与高阶函数参数中的闭包特征界限

javascript - JQuery 事件之外的变量范围