我知道的JS-函数


函数

函数就是一段可以反复调用的代码块.函数还能接受输入的参数,不同的参数会返回不同的值.
具名函数,匿名函数,箭头函数

this & arguments

this 就是 call 一个函数时,传入的第一个参数(一般是对象)
call 的其他参数统称为 arguments

fn() 里面的 this 就是 window
fn() 是 strict mode,this 就是 undefined
a.b.c.fn() 里面的 this 就是 a.b.c
new F() 里面的 this 就是新生成的实例
() => console.log(this) 里面 this 跟外面的 this 是一样的

闭包

闭包的定义很简单:函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包。

function A() {
  let a = 1;
  function B() {
    console.log(a);
  }
  return B;
}

经典面试题,循环中使用闭包解决 var 定义函数的问题

for (var i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i);
  }, i * 1000);
}

首先因为 setTimeout 是个异步函数,所有会先把循环全部执行完毕,这时候 i 就是 6 了,所以会输出一堆 6。

解决办法两种,第一种使用闭包

for (var i = 1; i <= 5; i++) {
  (function(j) {
    setTimeout(function timer() {
      console.log(j);
    }, j * 1000);
  })(i);
}

第二种就是使用 setTimeout 的第三个参数

for (var i = 1; i <= 5; i++) {
  setTimeout(
    function timer(j) {
      console.log(j);
    },
    i * 1000,
    i
  );
}

第三种就是使用 let 定义 i 了

for (let i = 1; i <= 5; i++) {
  setTimeout(function timer() {
    console.log(i);
  }, i * 1000);
}

因为对于 let 来说,他会创建一个块级作用域

call/apply/bind

fn.call(asThis,p1,p2) 是正常的调用方式
不确定参数的个数时,用 apply,fn.apply(asThis,params)
bind 返回一个新的函数

mixin 混入

将一个对象的属性赋值给另一个对象

var mixin = function(a, b) {
  for (let key in b) {
    a[key] = b[key];
  }
};

curry 柯里化

把接收多个参数的函数变成接收一个单一参数的函数,并且返回接收剩余参数的函数的结果的新函数
(将真实的计算放到最后做)
柯里化之前

var add = function(a, b) {
  return a + b;
};

柯里化之后

var add = function(a) {
  return function(b) {
    return a + b;
  };
};

高阶函数

在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:
接受一个或多个函数作为输入:forEach sort map filter reduce
输出一个函数:lodash.curry
不过它也可以同时满足两个条件:Function.prototype.bind


文章作者: 沐雪
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 沐雪 !
评论
 上一篇
我知道的JS-深浅拷贝 我知道的JS-深浅拷贝
深浅拷贝 2019.9更新对于简单类型的数据来说,赋值就是深拷贝对于复杂类型的数据(对象)来说,才要区分浅拷贝和深拷贝 赋值传递对象的引用而已,原始列表 a 改变,被赋值的 b 也会做相同的改变 var a = { name: "mu
2018-04-15
下一篇 
我知道的JS-继承 我知道的JS-继承
继承继承可以使得子类具有父类的各种属性和方法在高程中介绍了好多种,但是完美的就这一种,所以,就理解好这一种就可以了 ES5 中的继承function Human(name) { this.name = name; } Human.pro
2018-04-10
  目录