- Function.prototype.curry = function() {
- let defaultArgs = arguments;
- let that = this;
- return function(){
- return that.apply(null,
- arguments.concat(defulatArgs));
- }
- }
然则因为参数不是一个数组,没有concat函数,所以须要把伪数组转成一个伪数组,可以用Array.prototype.slice:
ES7新增了两个新的属性async/await用于处理的异步的情况,让异步代码的写法就像同步代码一样,如下async版本的sleep:
- Function.prototype.curry = function() {
- let slice = Array.prototype.slice;
- let defaultArgs = slice.call(arguments);
- let that = this;
- return function() {
- return that.apply(null,
- arguments.concat(slice.call(defulatArgs)));
- }
- }
如今举一下柯里化一个有效的例子,当须要把一个数组降序排序的时刻,须要如许写:
- let data = [1,5,2,3,10];
- data.sort((a, b) => b - a); // [10, 5, 3, 2, 1]
给sort传一个函数的参数,然则如不雅你的降序操作比较多,每次都写一个函数参数照样有点烦的,是以可以用柯里化把这个参数固化起来:
- Array.prototype.sortDescending =
- Array.prototype.sort.curry((a, b) => b - a);
如许就便利多了:
- let data = [1,5,2,3,10];
- data.sortDescending();
- console.log(data); // [10, 5, 3, 2, 1]
每次履行都要setTimeout一下,如不雅触发得很快就把上一次的setTimeout清掉落从新setTimeout,如许就不会履行很快了。然则如许有个问题,就是这个回调函数可能永远不会履行,因为它一向在触发,一向在清掉落tId,如许就有点难堪,膳绫擎代码的本意应当是100ms内最多触发一次,而实际情况是可能永远不会履行。
有一个比较有趣的现象是ES6的class也是返回function:
5. 防止修改对象
有时刻你可能怕你的对象被误改了,所以须要把它保护起来。
(1)Object.seal防止新增和删除属性
如下代码,当把一个对象seal之后,将不克不及添加和删除属性:
- let scriptBegin = Date.now();
- fun1();
- fun2();
- // 须要履行20ms的工作单位
- function act(functionName) {
- console.log(functionName, Date.now() - scriptBegin);
- let begin
推荐阅读
深度进修在2006年开端崭露头脚后,近几年取得了飞速的成长,无论是学术研究照样企业应用均出现出指数级增长的趋势;伴跟着这项技巧的赓续成熟,深度进修在智能语音范畴率先发力,取得一系列>>>详细阅读
本文标题:JS高级程序设计高级技巧
地址:http://www.17bianji.com/lsqh/37133.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示