为什么在使用function.apply时没有Closure类型检查参数?

时间:2015-01-14 00:15:46

标签: javascript google-closure-compiler google-closure

见下文

/**
 * @param {string} a
 * @param {string} b
 */
var f = function(a, b){
    // ...
}

/**
 * @param {string} a
 * @param {boolean} c
 */
var h = function(a, c){
    f.apply(this, arguments); // no compile error
    f.apply(this, [a, c]);    // no compile error
    f.call(this, a, c);       // compile error: does not match formal parameter
}

为什么Closure仅在使用呼叫时引发错误而不适用? 有没有办法我可以进行封闭类型检查参数,即使我使用apply?

1 个答案:

答案 0 :(得分:2)

因为(a)类型检查器还没有元组类型的概念,并且(b)很少调用带有数组文字的方法。使用.call时确定哪个参数分配给哪个参数槽是微不足道的。

如果类型系统增长了一个元组类型,那么就需要花费更多的精力进行检查。因为数组“slot”类型和长度更容易被人知道。