JS-函数

作者: 小废柴JH | 来源:发表于2019-08-14 18:27 被阅读0次

    1.定义
    (1)匿名函数
    (2)具名函数
    (3)箭头函数,无this

    1. 词法作用域(也叫静态作用域)
      JS看到上面的代码不是立马去执行,而是去构造词法树,也就是一个函数能访问那些变量在做词法分析的时候就以及确定了。词法作用域只能确定变量是那个变量,但是不能确定变量的值。

    2. call stack
      (1) 普通调用 1+1+1
      (2) 嵌套调用 1>2>3
      (3) 递归

    3. this & arguments
      (1) this 就是 call 的第一个参数!call 的其他参数统称为 arguments
      (2) this 是隐藏的第一个参数,且一般是对象(如果不是对象,就显得很没有意义了)。那么this 为什么必须是对象?即使传入的不是对象,比如是数字,也会被new Number一下,变成一个对象,因为 this 就是函数与对象之间的羁绊。

    4. call / apply
      (1)fn.call(asThis, p1,p2) 是函数的正常调用方式。
      (2)当你不确定参数的个数时,就使用 apply,fn.apply(asThis, params)
      (3)也就是确定参数个数的时候使用call,不确定参数个数的时候使用apply,这也是它们俩的区别。比如当我们去遍历一个数组求和,就算数组很小,但是使用call的话就如:sum.call(undefined, a[0],a[1],a[2]...),这个写就显得很智障了。
      (4)若单独的函数(fn)没有依赖于对象,当调用fn.call()的时候,不传参数,this就是window,传了参数this就是call的第一个参数,一般不想指定this,可以使用undefined来占位,否则就会出现把我们想传的参数,默认第一个为this了。

    5. bind
      call 和 apply 是直接调用函数,而 bind 则是返回一个新函数(并没有调用原来的函数),这个新函数会 call 原来的函数,call 的参数由你指定。

    6. return
      每个函数都有 return。如果你不写 return,就相当于写了 return undefined。

    7. 柯里化 / 高阶函数
      (1)

      //柯里化之前
      function sum(x,y){
          return x+y
      }
      //柯里化之后 ,类似于偏函数
      function addOne(y){
          return sum(1, y)
      }
    

    柯里化可以将真实计算拖延到最后再做:柯里化大多数是在模板引擎里面使用,大部分是用来惰性求值,如调用一个函数什么都没做,就是return了一个函数。若对一个字符串做很重的操作,如正则,ajax,要是直接声明就调用就显得麻烦,那么就可以在真正使用的时候再去调用,如在第二次调用的时候才生效,这样就是惰性求值。
    (2)高阶函数:
    在数学和计算机科学中,高阶函数是至少满足下列一个条件的函数:

    • 接受一个或多个函数作为输入:如forEach sort map filter reduce。
    • 输出一个函数:如lodash.curry。
    • 不过它也可以同时满足两个条件:如Function.prototype.bind。
    1. 回调
      名词形式:被当做参数的函数就是回调,还有一个隐含条件就是,这个被当作参数的函数得call一下,这个call就是callback,若不call就不是callback了。
      动词形式:调用这个回调。
      注意回调跟异步没有任何关系。

    2. 构造函数
      返回对象的函数就是构造函数,一般首字母大写。

    相关文章

      网友评论

          本文标题:JS-函数

          本文链接:https://www.haomeiwen.com/subject/iiynjctx.html