总结一下js的函数类型

2018-04-29  本文已影响0人  Willworkgogogo

几个概念

  1. 在js中,函数就是个对象
  2. 函数名就是个指向函数对象的指针

函数的三种声明方式

  1. 函数声明
   // 语法
   function sayName(name) {
    console.log(name)
   }
  1. 函数表达式
  // 语法
  var  sayName = function(name){
    console.log(name)
  }
  1. 使用Fuction构造函数生成实例
  // 前面都是函数参数,最后一个字符串参数表示函数体
  var sum = new Function("num1", "num2", "num1+num2")
  // 不推荐的原因:
  // 1. 需要两层解析,一是函数解析,而是对内部字符串的解析,耗性能
  // 1. 书写麻烦,函数体还不能写复杂

函数声明和函数表达式的区别

要理解它们的区别,先要知道几个概念

  1. 解析器,就是对js源码进行一定规则解析,然后交给执行环境执行
  2. 执行环境,js源码真正运行的环境

js解析器的规则有点特殊,有两个提升

  1. 变量提升,源码中声明的变量会被被解析器提取出来,在源码逐行执行前被执行,此时变量会被赋值为undefined
  2. 声明函数提升,声明函数会被整体提升到代码执行前,所以在声明函数之前就调用该函数,是不会报错的,因为该函数已经被提升到执行环境的头部了

总结:

  1. 函数表达式,只会提升它的变量,该变量为undefined,只有当代码执行该函数所在的位置时,该变量才会被真正指向该函数。所以在函数表达式之前的调用,都会导致脚本报错
  2. 声明函数会被提升,提前引用不会报错

函数的属性和方法

  1. 内部属性this和arguments
    1. this,表示调用函数的对象的引用
    2. arguments,函数参数组合而成的类数组
    3. arguments.callee,该属性指向该函数,做递归的时候很好用
  2. 函数本身的属性和方法
    1. length, 返回函数参数的个数
    2. apply()、call()、bind(), 用于函数继承并修改内部this指向,详情可以看我的另一篇介绍,蛮简单的。传送门
上一篇下一篇

猜你喜欢

热点阅读