bre*_*ine 2 javascript function ecmascript-5 ecmascript-3
我正在Javascript 上观看Crockford - 第三幕:在大约 41 分 26 秒时发挥终极作用。他屏幕上的代码arguments.slice()以一种导致我出错的方式使用。
function curry(func){
var args = arguments.slice(1);
...
}
Run Code Online (Sandbox Code Playgroud)
他是这样解释的:
我将首先得到一个参数数组,除了第一个,因为第一个是一个函数,我不需要那个。在这种情况下,我假设我在 ES5 上,所以我没有做可怕的
Array.prototype.apply()把戏。
问题是运行会arguments.slice()导致此错误:
Uncaught TypeError: arguments.slice is not a function
我正在测试肯定有 ES5 的现代浏览器!我可以让代码工作的唯一方法是,如果我使用一些“可怕的”技巧,(如他所称),例如Array.prototype.slice.apply(arguments, [1])或[].slice.call(arguments, 1);.
他只是误会了吗?他的幻灯片有错别字吗?为什么arguments.slice()在我的 ES5 浏览器中不起作用?
引用TC39 成员 Allen Wirfs-Brock:
直到 ECMAScript 5 开发的后期,参数对象才会继承所有 Array.prototype 方法。但是 2009 年 9 月 TC39 批准的 ES5 的“最终草案”没有这个功能。
让 arguments 对象从 Array 原型继承其实是计划好的,但是当它付诸实践时,它打破了 web。因此,它在正式出版前从最终修订版中删除。
如今,随着 ECMAScript 2015(又名 ES6)标准化,最好的方法是使用rest 参数:
function curry(func, ...args) {
// ...
}
Run Code Online (Sandbox Code Playgroud)
相当于 ES5:
function curry(func) {
var args = [].slice.call(arguments, 1);
// ...
}
Run Code Online (Sandbox Code Playgroud)
此功能已在 Firefox 和 Edge 中原生可用,如果您使用 JavaScript 编译器(例如Babel ),则可以在任何地方使用。