EcmaScript 6:尾部位置的新运算符
EcmaScript 6: New operator in tail position
即将推出的 ES6 标准要求尾部位置 new f(x)
形式的表达式是尾部调用。
我能想到一些这很重要的人为例子,例如
function Sum(n, m) {
if (n === 0) {
this.m = m;
} else {
return new Sum(n - 1, n + m);
}
}
function f(n) {
return new Sum(n, 0).m;
}
f(1000000)
但是有任何现实世界的用例吗?
P.S.:这是处理尾部位置的新运算符的规范:http://people.mozilla.org/~jorendorff/es6-draft.html#sec-expression-rules
这可能是为了完整性而添加的,而不是其他任何东西。毕竟,new
只不过是对新对象的函数调用。有一些例子并不完全是人为的,比如这个 LinkedList
:
function LinkedList(list, next = null) {
this.next = next;
this.value = list.pop();
if(list.length == 0) {
return this;
} else {
return new LinkedList(list, this);
}
}
// > var l = new LinkedList([1,2,3]);
// undefined
// > l.value
// 1
// > l.next
// LinkedList {next: LinkedList, value: 2}
// > l.next.next
// LinkedList {next: null, value: 3}
即将推出的 ES6 标准要求尾部位置 new f(x)
形式的表达式是尾部调用。
我能想到一些这很重要的人为例子,例如
function Sum(n, m) {
if (n === 0) {
this.m = m;
} else {
return new Sum(n - 1, n + m);
}
}
function f(n) {
return new Sum(n, 0).m;
}
f(1000000)
但是有任何现实世界的用例吗?
P.S.:这是处理尾部位置的新运算符的规范:http://people.mozilla.org/~jorendorff/es6-draft.html#sec-expression-rules
这可能是为了完整性而添加的,而不是其他任何东西。毕竟,new
只不过是对新对象的函数调用。有一些例子并不完全是人为的,比如这个 LinkedList
:
function LinkedList(list, next = null) {
this.next = next;
this.value = list.pop();
if(list.length == 0) {
return this;
} else {
return new LinkedList(list, this);
}
}
// > var l = new LinkedList([1,2,3]);
// undefined
// > l.value
// 1
// > l.next
// LinkedList {next: LinkedList, value: 2}
// > l.next.next
// LinkedList {next: null, value: 3}