【发布时间】:2014-12-20 17:53:59
【问题描述】:
在bluebird wiki article about JavaScript optimization killers中,作者提到将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 宏语法。 This is what I have so far:
example.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:
^
【问题讨论】:
-
实际上,您的第一个函数很好,因为您返回的是一个数组,而不是一个参数。您也不需要循环或临时变量。
-
@dandavis 出于我的目的,我想要循环。您有机会阅读链接的文章吗?它解释了为什么不想将
arguments传递给Array.prototype.slice.call。
标签: javascript macros infix-notation sweet.js