【问题标题】:Why won't the Closure Compiler enforce function signatures for objects returned from anonymous functions?为什么闭包编译器不会对匿名函数返回的对象强制执行函数签名?
【发布时间】:2012-05-11 22:24:46
【问题描述】:

我正在创建具有 Crockford 普遍提倡的私有/公共访问限制的对象。例如,我有这样的事情:

var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

如果我拨打电话,比如

myPublicFunction();

闭包应该告诉我我正在调用一个参数数量错误的函数。我尝试在 myPublicFunction 上使用 JavaDoc cmets 帮助 Closure:

var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        /**
         * @param {string} str
         */
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

foo.myPublicFunction();

仍然没有抱怨。我已经为 foo 尝试了各种形式的 JavaDocs,唯一有效的是将其记录为记录类型:

/**
 * @type {{myPublicFunction:function(string):string}}
 */
var foo = (function() {
    var myPrivateVariable = "whatever";
    return {
        /**
         * @param {string} str
         */
        myPublicFunction:function(str){
                    return str;
                }
    }
}());

foo.myPublicFunction();

这行得通,但编译器并没有尝试强制 myPublic 对象函数实际匹配我在 JavaDoc 的记录字段中记录的签名。所以只要我确保在这些返回的对象中记录我的所有函数并确保我的文档中的签名与我实际返回的内容保持一致,这将起作用。我是否错过了一些更好的方法来执行此操作?

谢谢!

【问题讨论】:

  • 使用 --warning_level=VERBOSE,我确实会从这段代码中得到一个警告(使用最新的闭包编译器):“函数 foo.myPublicFunction:使用 0 个参数调用。函数至少需要 1 个参数且不超过 1 个参数。”

标签: google-closure-compiler


【解决方案1】:

实际上,我鼓励您看看使用伪经典继承,因为编译器可以消除这些皱纹。 Michael Bolin 有一篇详细的文章描述了这个问题。

http://bolinfest.com/javascript/inheritance.php

【讨论】:

  • 啊,很有趣。感谢您的帮助(再次感谢您昨天帮助我解决了我的关闭问题)。我和我的团队正在思考是否更好地生成我们认为真实的、更便携的(如果我们决定不继续使用 Closure 编译器)运行时信息隐藏而不是 Closure 编译时强制执行;或者我们是否应该按照 Closure 喜欢的方式进行,因为我们会在未来得到更好的结果。现在,我们只是将脚趾放入 Closure 池中,仅将其用于错误捕获而不是压缩,而是用于线下...
  • 哦,另外,您对 Closure 未能强制执行函数签名声明有任何想法/cmets。我在帖子的最后提到了它,但是如果我写 /** @type {function(string)} */ var foo = function(){};,编译器不会注意到差异。
【解决方案2】:

您没有向“foo”提供任何类型信息。您已向对象的属性 (myPublicFunction) 提供类型信息。

您的“记录类型”JsDoc 实际上将类型信息放在“foo”上,因此它可以工作。

这是编译器的预期行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2013-12-07
    • 2012-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多