1.闭包
1.闭包就是函数的返回值也是个函数
当一个函数的返回值也是一个函数时,其内部的局部变量还被新函数引用,内部变量的使用就会造成错误。
注意:返回函数不要引用任何循环变量,或者后续会发生变化的变量(例如for循环的变量)
eg:
function count() {
var arr = [ ];
for (var i=1; i<=3; i++) {
arr.push(function () {
return i * i;
});
}
return arr;
}
var results = count();
f();//此时内层函数for的i已经变为4,在被外层函数使用,得到的值最终是16
2.解决方法:再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变。
eg:
function count() {
var arr = [];
for (var i=1; i<=3; i++) {
arr.push((function (n) {
return function () {
return n * n;
}
})(i));//把该函数的参数绑定 i 当前的值
}
return arr;
}
创建一个匿名函数并立刻执行,形如:
(function (x) { return x*x } (3))
2.箭头函数
1.箭头函数相当于匿名函数,并且简化了函数定义。
形式: x => xx;
等价于:
function( x) {
return xx;
}
箭头函数有两种格式:
第1种是只包含一个表达式,连{ ... }和return都省略掉了。
eg:
x => x*x;
第2种可以包含多条语句,这时候就不能省略{ ... }和return:
eg:
x => {
if(x >0)
return x*x ;
else
return x*(-x);
}
两个参数,括号括起来: (x, y) => x * x + y * y;
如果返回对象,因为函数体
{.....}
会与对象冲突,所以改变为(....):
x = ( { foo:x } );
箭头函数的this的指向和作用域是根据上下文决定的。也更加方便的解决了之前出现的this指向对象问题。
箭头函数完全修复了this的指向,this总是指向词法作用域,也就是外层调用者xiaoming。
var xiaoming = {
name:'小明 ',
birth: 1990,
getAge: function () {
var b = this.birth; // 1990
var fn = () => new Date().getFullYear() - this.birth; // this指向xiaoming
return fn();
}
};
xiaoming.getAge(); // 28
由于this在箭头函数中已经按照词法作用域绑定了,所以,用call()或者apply()调用箭头函数时,无法对this进行绑定,即传入的第一个参数被忽略。
网友评论