【问题标题】:How to call a function's methods from within another function如何从另一个函数中调用函数的方法
【发布时间】:2015-01-03 00:07:22
【问题描述】:

在下面的form 对象中,在“检查”函数中,如何调用通知函数的“显示”和“隐藏”方法?

(function (namespace, $, undefined) {
    var form = {
        check : function(){
            form.notification.show(); // Generates an error
        },

        notification : function(){
            this.show = function(){
                ...
            };
            this.hide = function(){
                ...
            };
        }
    };
}(window.namespace = window.namespace || {}, jQuery));

form.notification.show() 出现以下错误:

未捕获的类型错误:无法读取未定义的属性“显示”

【问题讨论】:

    标签: javascript methods scope call


    【解决方案1】:

    尝试在form之外定义notification,然后引用它:

    var notification : { // no function here
            show : function(){...}, // avoid "this"
            hide : function(){...}
    };
    
    var form = {
        check : function(){
            notification.show(); // <-- Use here
        },
    
        notification : notification // and here
    };
    

    (为了清楚起见,我省略了jQuery 保护代码)。

    下一个问题是,当函数 notification() 执行时,您 this.show = 会将函数分配给 this 的任何内容。 this 不是 notification

    【讨论】:

    • 奇怪 - 这似乎没有任何效果。我现在想知道我的“工作”代码中是否存在冲突......
    • 好吧,看来我确实可以访问我原始代码中的通知功能。如果我在检查函数中运行console.log(form.notification),它会返回脚本。有什么想法吗?
    • 查看我的编辑。 show 被放入 thisthis !== form.notification(最有可能)。
    • 你是对的 - this 指的是表单对象。将notification 设为对象似乎是显而易见的解决方法。
    • 我再次改进了我的答案。如果现在解决了你的问题,请采纳。
    【解决方案2】:

    您已将其包含在内,因此您需要将其归还,这将为您公开,如果您在 chrome 控制台中执行以下操作,您将看到您可以访问表单对象

    (function (namespace, $, undefined) {
    
    var form = {
    
            check : function(){
                form.notification.show(); // Generates an error
            },
    
            notification : function(){
                this.show = function(){
    
                };
                this.hide = function(){
    
                };
            }
    
    
    };
    return{form:form};}(window.namespace = window.namespace || {}, jQuery));
    

    我对你的代码所做的一切都被添加了

    return{form:form};
    

    在表单对象之后。希望这会有所帮助

    编辑

    如果您只想公开表单的某些部分,例如只显示通知,您可以像这样修改返回:

    return{form.notification: notification}
    

    【讨论】:

    • 也不完全确定它为什么被否决。但是,这不是一个可行的选择,因为 return 语句后面可能没有任何内容。
    • 不正确复制上面的代码并将其粘贴到您的控制台中。然后输入 window.namespace 并查看它返回的内容。
    • 我投了反对票,因为那时答案只是一段没有解释的代码。此外,几乎总是在该对象中通过其外部名称引用该对象是一个坏主意 - 在大多数情况下,它应该可以作为 this 访问。
    猜你喜欢
    • 2014-12-03
    • 1970-01-01
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    相关资源
    最近更新 更多