【发布时间】:2015-08-30 21:58:16
【问题描述】:
最近我进入了 javascript 生态系统。在使用 javascript 的回调一段时间后,我开始问自己 javascript 解释器是否能够对回调参数进行条件评估。下面举两个例子:
var a = 1;
var b = 2;
// example 1
abc.func(a, b, function (res) {
// do something with res
});
// example 2
abc.func(a, b, function () {
// do something
});
据我了解,Javascript 使用 arguments 对象来跟踪传递给函数的内容。这与函数定义是什么无关。所以假设:
abc.func = function (a, b, cb) {
// do stuff
var res = {};
// Expensive computation to populate res
cb(res);
}
在两个示例 (1, 2) 中,res 对象将被传递给 arguments[0]。在示例 1 中 res === arguments[0] 因为定义了 res 参数。
假设计算res 的成本很高。在示例 1 中,由于使用了 res 对象,因此可以进行此计算。在示例 2 中,由于未使用 res 对象,因此进行该计算确实没有意义。虽然,由于需要填充arguments 对象,但在这两种情况下,填充res 的计算都已完成。这是正确的吗?
假设这是真的,这似乎是(潜在的)巨大浪费。为什么要计算超出范围并被垃圾收集的东西?想想所有使用回调的库。它们中的许多将多个参数发送回回调函数,但有时它们都没有被使用。
有没有办法防止这种行为。本质上使 Javascript 解释器足够智能,不会计算那些将变成未使用参数的特定变量?因此,在示例 2 中,res 对象实际上不会被计算,因为它永远不会被实际使用。
我知道在此之前使用了这样的东西:
function xyz(a, b /*, rest */)
// use arguments to iterate over rest
}
所以默认情况下仍然计算这些参数是有意义的。现在让我们期待 ECMAScript 2015。这将包括要定义的 ...rest 参数。那么对于支持新版本的引擎,有没有办法启用条件评估呢?这会更有意义,因为现在有一种方法可以明确要求评估并将所有额外参数传递给函数。
【问题讨论】:
-
res不是由回调计算,而是由调用回调的函数计算。所以由调用回调的函数来检查回调预期的参数并计算是否需要的参数。 -
我很清楚
res是在调用回调的函数中计算出来的。对不起,如果问题没有说清楚。什么部分造成了混乱? -
这不是混淆。您的问题看起来好像您认为使用不适合函数参数的额外参数调用回调会有所不同,但事实并非如此。填充论点确实如此。而你这样做只是因为你认为回调可能会使用它。
标签: javascript callback ecmascript-6