关于JavaScript函数的一点冷知识

红宝书第十章,关于函数,记录一些平时可能注意不到的东西。

  • 函数其实是一个对象。
  • 可以把函数想象为对象,函数名想象为指向函数的指针。
  • 箭头函数不可以使用arguments,super,new.target,没有prototype属性。
  • 因为函数名是指向函数的指针,所以一个函数其实可以有多个名称。
  • ECMAScript6中所有函数对象都会暴露一个只读的name属性,包含关于函数的信息。
  • arguments对象类似数组,但不是数组,使用时通常需要转化一下:let args = Array.prototype.slice.call(arguments);
  • 函数不能重载,但可以通过判断变量个数来类似地实现重载效果。
  • 函数声明和函数表达式是有区别的,在直接声明之前调用是OK的,这叫做声明提升,但如果改为等价的函数表达式,调用就会出问题。因为此时它的定义包含在一个变量初始化语句中,而不是函数声明中。
  • arguments.callee是指向arguments对象所在函数的指针,可以用来函数内部调用(递归),严格模式下使用这个会报错。
  • 重点!this在标准函数和箭头函数下的行为不一样。
    • 在标准函数中,this引用的是把函数当成方法调用的上下文对象,在网页的全局上下文调用函数时,this指向的是window。
    • this到底引用的是哪个对象,要到函数被调用时才能确定。
    • 执行上下文可以理解为当前代码的运行环境。在 JavaScript 中,运行环境主要包含了全局环境和函数环境。在 JavaScript 代码运行过程中,最先进入的是全局环境,而在函数被调用时则进入相应的函数环境。全局环境和函数环境所对应的执行上下文我们分别称为全局上下文和函数上下文。
    • 箭头函数中,this引用的是定义箭头函数的上下文,也就是箭头函数在哪个上下文定义,this就指向哪个上下文。
    • 所以这就导致箭头函数里需要慎重使用this。
  • caller引用的是调用当前函数的函数,在全局作用域中caller为null。
  • new.target用于检测函数是否使用new初始化,是则返回true,否则返回false。
  • call和apply方法的作用是一样的,都以指定的this值来调用某个函数,会改变调用函数时this对象的值。
    • apply方法接收两个参数,this值与参数数组,当然第二个参数传arguments也可以。
    • call传参形式与apply不同,第一个参数也是this值,但之后可以传不定个参数,将所需要的参数一个个列出来。
    • 到底用的时候选哪个?传参怎么方便怎么来。如果不需要传参呢?随便,用啥都行。
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2018-2023 Shawn Zhou
  • Hexo 框架强力驱动 | 主题 - Ayer
  • 访问人数: | 浏览次数:

感谢打赏~

支付宝
微信