关于函数

83 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

  • 定义函数的三种方式
    • 命名函数:function fnName() {}
    • 匿名函数:var fnName = function () {}
    • 通过构造函数Function:var fnName = new Function ('形参1', '形参2', ..., '函数体代码')
  • 函数也是对象,既然是对象,就有原型
  • 所有的函数都是Function这个构造函数的实例:函数.__proto__ === Function.prototype

函数中的 this指向问题:

  • 普通函数:window
  • 对象方法:该方法所属对象
  • 通过new关键字,构造函数&构造函数.prototype上的方法:实例
  • 事件绑定:事件源
    • 事件三要素:事件源,事件类型,事件处理函数
    • 事件流:捕获、目标、冒泡
  • 定时器:window
  • 自执行函数:window

call方法:可以改变函数内的this指向,并立即调用函数,一般在继承属性

  • 基本语法:someFn.call(thisArg, arg1, arg2, arg3, ...)

apply方法:跟call方法的作用一样,只不过在传参上有区别

  • 基本语法:someFn.apply(thisArg, [ arg1, arg2, arg3, ... ])

call和apply我们推荐使用call方法,都可以完成同样的功能

拓展知识点:...语法,是ES6新增的语法,展开表达式,会把数组中所有的元素一个个以逗号隔开的形式拎出来

bind方法:也可以改变函数内的this指向,传参方式和call方法一样,but不会立即调用函数,会返回一个改变原函数内部this指向后的新函数给你,并且无法通过call/apply/bind方法再次修改这个新函数内部的this指向

  • 应用场景:如果只需要修改函数内部的this指向,不需要立即调用,我们就用bind
  • 基本语法:someFn.bind(thisArg, arg1, arg2, arg3, ...)

如果在调用call/apply/bind时,第一个参数为null或undefined,则内部的this指向window

严格模式:

  • 什么是严格模式?就是可以让我们的JS代码更严谨的模式,可以让JS程序员提前适应未来的JS语法,可以提高编译效率,增加运行速度
  • 如何开启严格模式?只用在第一行加上一个字符串:'use strict'就阔以了
  • (JS中用单引号,HTML中用双引号)
  • 既可以为整个脚本开启,也可以为单个函数开启
  • 在IE10版本以上才认识
  • 严格模式的变化:
    • 变量
      • 不声明,不能用,必须先var声明后才能使用
      • 不能通过delete删除变量,还是可以删对象中的属性的
    • 函数的变化
      • 不能有重复的形参名
      • 普通函数在调用时,内部的this指向不再是window,而是undefined,由于这点,那么我们的构造函数如果不通过new关键字调用,内部使用了this.xxx 点语法,就相当于是在用undefined.xxx,会有语法错误
      • 不能在非函数代码块中定义函数

高阶函数:说白了,就是接收函数作为参数或者将函数作为返回值输出的函数就是高阶函数

闭包:闭包(closure)指有权访问另一个函数作用域中变量的函数

闭包是一个现象:在一个函数中访问了另一个作用域中的变量,我们也把该函数称之为闭包函数

闭包的作用:延伸了变量的作用域范围,但是不要频繁使用,会造成内存泄露

what is 递归函数?自己调用自己的函数,注意:一定要有条件去return终止调用,不然会栈溢出