定义一个箭头函数很简单,基本语法是:
JS
([param] [, param]) => {
statements
}
param => expression
param 是参数,根据参数个数不同,分这几种情况:
() => { ... } // 零个参数用 () 表示;
x => { ... } // 一个参数可以省略 ();
(x, y) => { ... } // 多参数不能省略 ();
当然,和普通函数一样,箭头函数也可以使用 ES6 新增的「默认参数」和「剩余参数」( Firefox15+ 开始支持):
JS
var func1 = (x = 1, y = 2) => x + y;
func1(); // 得到 3
var func2 = (x, ...args) => { console.log(args) };
func2(1,2,3); // 输出 [2, 3]
箭头函数允许多行语句或者单行表达式作为函数体。多行语句要用 {} 括起来;单行表达式不需要 {},并且会作为函数返回值:
JS
x => { return x * x }; // 函数返回 x * x
x => x * x; // 同上一行
x => return x * x; // SyntaxError 报错,不能省略 {}
x => { x * x }; // 合法,没有定义返回值,返回 undefined
箭头函数也是 JS 函数的一种,所以之前的 instanceof 和 typeof 依然可用:
JS
var func1 = () => {};
func1 instanceof Function; // true
var func2 = () => {};
typeof func2; // "function"
特性
Nicholas C. Zakas 的博客中指出了箭头函数的几个特性:不能被 new 、this 被绑定为函数定义时的 this 且无法改变、不支持 arguments 。对于最后一点,我在 Firefox24 测试发现,arguments 可以正常工作。不知道是标准有变化,还是 Firefox 的实现有偏差,我们来看前两个特性。
箭头函数内部没有 constructor 方法,也没有 prototype,所以不支持 new 操作。new (() => {}) 会触发 TypeError 报错。
JS 里的 this 指针一直是新手很头疼的事情,看一个简单的例子:
JS
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
setTimeout(function() {
this.func();
}, 100);
}
};
o.test(); // TypeError : this.func is not a function
上面代码得不到预期结果,因为 this 发生了改变,这个问题可以这样修正:
JS
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
var _this = this;
setTimeout(function() {
_this.func();
}, 100);
}
};
o.test();
在函数内部使用外部事先保存的 this 就没问题了。也可以改用 ES5 引入的 bind 方法:
JS
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
setTimeout(function() {
this.func();
}.bind(this), 100);
}
};
o.test();
而有了箭头函数,像下面这样写就可以了:
JS
var o = {
x : 1,
func : function() { console.log(this.x) },
test : function() {
setTimeout(() => { this.func() }, 100);
}
};
o.test();
箭头函数的 this 始终指向函数定义时的 this,而非执行时。下面看一个尝试改变箭头函数 this 指针的例子:
JS
var x = 1,
o = {
x : 10,
test : () => this.x
};
o.test(); // 1
o.test.call(o); // 依然是1
摘自:https://imququ.com/post/arrow-function-in-es6.html
JavaScript中this的使用
在JavaScript中this变量是一个令人难以摸清的关键字,this可谓是非常强大,充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。
对于this变量最要的是能够理清this所引用的对象到底是哪一个,也许很多资料上都有自己的解释,但有些概念讲的偏繁杂。而我的理解是:首先分析this所在的函数是当做哪个对象的方法调用的,则该对象就是this所引用的对象。
示例一、
复制代码 代码如下:
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //弹出 100
这段代码非常容易理解,当执行 obj.y() 时,函数是作为对象obj的方法调用的,因此函数体内的this指向的是obj对象,所以会弹出100。
示例二、
复制代码 代码如下:
var checkThis = function(){
alert( this.x);
};
var x = 'this is a property of window';
var obj = {};
obj.x = 100;
obj.y = function(){ alert( this.x ); };
obj.y(); //弹出 100
checkThis(); //弹出 'this is a property of window'
这里为什么会弹出 ‘this is a property of window’,可能有些让人迷惑。在JavaScript的变量作用域里有一条规则“全局变量都是window对象的属性”。当执行checkThis() 时相当于window.checkThis(),因此,此时checkThis函数体内的this关键字的指向变成了window对象,而又因为window对象又一个x属性(’thisis a property of window’),所以会弹出 ‘thisis a property of window’。
上面的两个示例都是比较容易理解的,因为只要判断出当前函数是作为哪个对象的方法调用(被哪个对象调用)的,就可以很容易的判断出当前this变量的指向。
摘自:http://www.jb51.net/article/42257.htm
其实也就是说,this总是只想定义函数是所在的上一级。
例如
var dd = {
xx:1,
zz = function(){
this; //指向的是dd
function xx = {
aa = 3,
this; //指向的是zz
function ii = {
this ; //指向的是xx
}
}
}
}
总结:
其实this就是指对象本身,首相你要理解对象,想windows对象等等,他是object类型,而非function,number,string,undifine,null和boolean. 对象object包含上面的所有属性,这时候你在该对象里面调用this,就只该对象本身。
var xx=99;
var obj={
xx:0,
func:function(){
this.xx; //就是指obj.xx 0
xx; //就是指window.xx 99
//所以一般不加this等等的都是直接调用的window对象的属性
}
}
这样应该很明白了吧。