2018-07-22 学习总结

2018-07-23  本文已影响0人  小本YuDL
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 x
x;
}
箭头函数有两种格式:
第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进行绑定,即传入的第一个参数被忽略。

上一篇下一篇

猜你喜欢

热点阅读