哪些网站做的海报比较高大上,高端酒店开发,王者荣耀个人主页,wordpress 应用模板下载基本用法 ES6 允许使用“箭头”#xff08;#xff09;定义函数。 var f v v; 上面的箭头函数等同于#xff1a; var f function(v) {return v;
}; 如果箭头函数不需要参数或需要多个参数#xff0c;就使用一个圆括号代表参数部分。 var f () 5;
// 等同于…基本用法 ES6 允许使用“箭头”定义函数。 var f v v; 上面的箭头函数等同于 var f function(v) {return v;
}; 如果箭头函数不需要参数或需要多个参数就使用一个圆括号代表参数部分。 var f () 5;
// 等同于
var f function () { return 5 };var sum (num1, num2) num1 num2;
// 等同于
var sum function(num1, num2) {return num1 num2;
}; 如果箭头函数的代码块部分多于一条语句就要使用大括号将它们括起来并且使用return语句返回。 var sum (num1, num2) { return num1 num2; } 由于大括号被解释为代码块所以如果箭头函数直接返回一个对象必须在对象外面加上括号。 var getTempItem id ({ id: id, name: Temp }); 箭头函数可以与变量解构结合使用。 const full ({ first, last }) first last;// 等同于
function full(person) {return person.first person.last;
} 箭头函数使得表达更加简洁。 const isEven n n % 2 0;
const square n n * n; 上面代码只用了两行就定义了两个简单的工具函数。如果不用箭头函数可能就要占用多行而且还不如现在这样写醒目。 箭头函数的一个用处是简化回调函数。 // 正常函数写法
[1,2,3].map(function (x) {return x * x;
});// 箭头函数写法
[1,2,3].map(x x * x); 另一个例子是 // 正常函数写法
var result values.sort(function (a, b) {return a - b;
});// 箭头函数写法
var result values.sort((a, b) a - b); 下面是 rest 参数与箭头函数结合的例子。 const numbers (...nums) nums;numbers(1, 2, 3, 4, 5)
// [1,2,3,4,5]const headAndTail (head, ...tail) [head, tail];headAndTail(1, 2, 3, 4, 5)
// [1,[2,3,4,5]] 使用注意点 箭头函数有几个使用注意点。 1函数体内的this对象就是定义时所在的对象而不是使用时所在的对象。 2不可以当作构造函数也就是说不可以使用new命令否则会抛出一个错误。 3不可以使用arguments对象该对象在函数体内不存在。如果要用可以用 rest 参数代替。 4不可以使用yield命令因此箭头函数不能用作 Generator 函数。 上面四点中第一点尤其值得注意。this对象的指向是可变的但是在箭头函数中它是固定的。 function foo() {setTimeout(() {console.log(id:, this.id);}, 100);
}var id 21;foo.call({ id: 42 });
// id: 42 上面代码中setTimeout的参数是一个箭头函数这个箭头函数的定义生效是在foo函数生成时而它的真正执行要等到100毫秒后。如果是普通函数执行时this应该指向全局对象window这时应该输出21。但是箭头函数导致this总是指向函数定义生效时所在的对象本例是{id: 42}所以输出的是42。 箭头函数可以让setTimeout里面的this绑定定义时所在的作用域而不是指向运行时所在的作用域。下面是另一个例子。 function Timer() {this.s1 0;this.s2 0;// 箭头函数setInterval(() this.s1, 1000);// 普通函数setInterval(function () {this.s2;}, 1000);
}var timer new Timer();setTimeout(() console.log(s1: , timer.s1), 3100);
setTimeout(() console.log(s2: , timer.s2), 3100);
// s1: 3
// s2: 0 上面代码中Timer函数内部设置了两个定时器分别使用了箭头函数和普通函数。前者的this绑定定义时所在的作用域即Timer函数后者的this指向运行时所在的作用域即全局对象。所以3100毫秒之后timer.s1被更新了3次而timer.s2一次都没更新。 箭头函数可以让this指向固定化这种特性很有利于封装回调函数。下面是一个例子DOM 事件的回调函数封装在一个对象里面。 var handler {id: 123456,init: function() {document.addEventListener(click,event this.doSomething(event.type), false);},doSomething: function(type) {console.log(Handling type for this.id);}
}; 上面代码的init方法中使用了箭头函数这导致这个箭头函数里面的this总是指向handler对象。否则回调函数运行时this.doSomething这一行会报错因为此时this指向document对象。 this指向的固定化并不是因为箭头函数内部有绑定this的机制实际原因是箭头函数根本没有自己的this导致内部的this就是外层代码块的this。正是因为它没有this所以也就不能用作构造函数。 所以箭头函数转成 ES5 的代码如下。 // ES6
function foo() {setTimeout(() {console.log(id:, this.id);}, 100);
}// ES5
function foo() {var _this this;setTimeout(function () {console.log(id:, _this.id);}, 100);
} 上面代码中转换后的ES5版本清楚地说明了箭头函数里面根本没有自己的this而是引用外层的this。 请问下面的代码之中有几个this function foo() {return () {return () {return () {console.log(id:, this.id);};};};
}var f foo.call({id: 1});var t1 f.call({id: 2})()(); // id: 1
var t2 f().call({id: 3})(); // id: 1
var t3 f()().call({id: 4}); // id: 1 上面代码之中只有一个this就是函数foo的this所以t1、t2、t3都输出同样的结果。因为所有的内层函数都是箭头函数都没有自己的this它们的this其实都是最外层foo函数的this。 除了this以下三个变量在箭头函数之中也是不存在的指向外层函数的对应变量arguments、super、new.target。 function foo() {setTimeout(() {console.log(args:, arguments);}, 100);
}foo(2, 4, 6, 8)
// args: [2, 4, 6, 8] 上面代码中箭头函数内部的变量arguments其实是函数foo的arguments变量。 另外由于箭头函数没有自己的this所以当然也就不能用call()、apply()、bind()这些方法去改变this的指向。 (function() {return [(() this.x).bind({ x: inner })()];
}).call({ x: outer });
// [outer] 上面代码中箭头函数没有自己的this所以bind方法无效内部的this指向外部的this。 长期以来JavaScript 语言的this对象一直是一个令人头痛的问题在对象方法中使用this必须非常小心。箭头函数”绑定”this很大程度上解决了这个困扰。 嵌套的箭头函数 箭头函数内部还可以再使用箭头函数。下面是一个 ES5 语法的多重嵌套函数。 function insert(value) {return {into: function (array) {return {after: function (afterValue) {array.splice(array.indexOf(afterValue) 1, 0, value);return array;}};}};
}insert(2).into([1, 3]).after(1); //[1, 2, 3] 上面这个函数可以使用箭头函数改写。 let insert (value) ({into: (array) ({after: (afterValue) {array.splice(array.indexOf(afterValue) 1, 0, value);return array;
}})});insert(2).into([1, 3]).after(1); //[1, 2, 3] 下面是一个部署管道机制pipeline的例子即前一个函数的输出是后一个函数的输入。 const pipeline (...funcs) val funcs.reduce((a, b) b(a), val);const plus1 a a 1;
const mult2 a a * 2;
const addThenMult pipeline(plus1, mult2);addThenMult(5)
// 12 如果觉得上面的写法可读性比较差也可以采用下面的写法。 const plus1 a a 1;
const mult2 a a * 2;mult2(plus1(5))
// 12 箭头函数还有一个功能就是可以很方便地改写λ演算。 // λ演算的写法
fix λf.(λx.f(λv.x(x)(v)))(λx.f(λv.x(x)(v)))// ES6的写法
var fix f (x f(v x(x)(v)))(x f(v x(x)(v))); 上面两种写法几乎是一一对应的。由于λ演算对于计算机科学非常重要这使得我们可以用ES6作为替代工具探索计算机科学。 附《ECMAScript 6 入门》http://es6.ruanyifeng.com/转载于:https://www.cnblogs.com/jjdw/p/7412471.html