在bluebird wiki 关于 JavaScript 优化杀手的文章中,作者提到将arguments
关键字传递给任何函数(除了apply
)都会导致父函数不可优化。我想创建一个sweet.js宏,它允许我编写标准的惯用 JavaScript,但会处理优化杀手。
理想情况下,我想要一个具有以下功能的宏:
function foo() {
var args = [].slice.call(arguments);
return args;
}
并输出如下内容:
function foo() {
var args = [];
for(var i, len = arguments.length; i < len; i++) {
args.push(arguments[i]);
}
return args;
}
但是,我无法正确获取 sweet.js 宏语法。 这是我到目前为止所拥有的:
例子.sjs
let arguments = macro {
rule infix {
[].slice.call |
} => {
[];
for(var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i])
}
}
}
function toArray() {
var args = [].slice.call arguments
return args;
}
输出以下内容:
function toArray() {
var args$2 = [];
for (var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i]);
}
return args$2;
}
我尝试让我的宏在arguments
关键字周围加上括号并包含var
声明,但没有任何成功。我试过这样的事情:
无效宏
let arguments = macro {
rule infix {
var $var = [].slice.call ( | )
} => {
var $var = [];
for(var i = 0, len = arguments.length; i < len; i++) {
args.push(arguments[i])
}
}
}
这会产生以下错误:
SyntaxError: [syntaxCase] Infix macros require a `|` separator
414:
^