ES6可以使用“箭头”(=>)定义函数
语法
首先是写法上的不同:
// es5
var fn = function (x, y) {
return x + y;
}
// es6 箭头函数写法,当函数直接被return时,可以省略函数体的括号
const fn = (x, y) => x + y;
// es5
var foo = function () {
var x = 10;
var y = 20;
return x + y;
}
// es6
const foo = () => {
const x = 10;
const y = 20;
return x + y;
}
ps:箭头函数可以替换函数表达式,但是不能替换函数声明
其次还有一个至关重要的一点,那就是箭头函数中,没有this。如果你在箭头函数中使用了this,那么该this一定就是外层的this。
ES5
var name = "window";
var obj = {
name: "kxy",
sayName: function () {
console.log();
}
};
obj.sayName(); //kxy
使用ES6
var name = "window";
var obj = {
name: "kxy",
sayName: () => {
console.log();
}
};
obj.sayName(); //window
换一种写法
var name = "window";
var obj = {
name: "kxy",
sayName: function () {
setTimeout(() => {
console.log();
}, 1000);
}
};
obj.sayName(); //kxy
编译后ES5:
var name = "window";
var obj = {
name: "kxy",
sayName: function sayName() {
var _this = this; // 注意这里
setTimeout(function () {
console.log(_);
}, 1000);
}
};
obj.sayName(); //kxy
箭头函数和普通函数区别
不能作用构造函数,不能使用new
箭头函数不绑定arguments,取而代之用rest参数...
箭头函数不绑定this,会捕获其所在的上下文的this值,作为自己this值
call 或 apply 方法调用函数,只是传入参数而已 对this 并没有影响。
箭头函数没有原型属性
箭头函数没有它自己的this值,箭头函数内的this值继承自外围作用域。在箭头函数中调用 this 时,仅仅是简单的沿着作用域链向上寻找,找到最近的一个 this 拿来使用
This的指向 (用法)
this
是 JavaScript 语言的一个关键字。
它是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。
function test() {
this.x = 1;
}
上面代码中,函数test
运行时,内部会自动有一个this
对象可以使用。
那么,this
的值是什么呢?
函数的不同使用场合,this
有不同的值。总的来说,this
就是函数运行时所在的环境对象。
下面分四种情况,详细讨论this
的用法。
情况一:纯粹的函数调用
这是函数的最通常用法,属于全局性调用,因此this
就代表全局对象。请看下面这段代码,它的运行结果是1。
var x = 1;
function test() {
console.log(this.x);
}
test(); // 1
情况二:作为对象方法的调用
函数还可以作为某个对象的方法调用,这时this
就指这个上级对象。
var obj = {
x: 1,
m: function () {
console.log(this.x);
}
}
obj.m(); // 1
情况三 作为构造函数调用
谓构造函数,就是通过这个函数,可以生成一个新对象。这时,this
就指这个新对象
function Test() {
this.x = 1;
}
var obj = new Test();
obj.x // 1
运行结果为1。为了表明这时this不是全局对象,我们对代码做一些改变
var x = 2;
function Test() {
this.x = 1;
}
var obj = new Test();
x // 2
情况四 apply 调用
apply()
是函数的一个方法,作用是改变函数的调用对象。它的第一个参数就表示改变后的调用这个函数的对象。因此,这时this
指的就是这第一个参数。
var x = 0;
var obj = {
x: 1,
m: function () {
console.log(this.x);
}
}
obj.m.apply(); // 1
apply()
的参数为空时,默认调用全局对象。因此,这时的运行结果为0
,证明this
指的是全局对象。
如果把最后一行代码修改为
obj.m.apply(obj); //1
运行结果就变成了1
,证明了这时this
代表的是对象obj
。