javascript 函数 初步认识

123 阅读2分钟

javascript 函数

Function 类型, 因为函数是对象,因此函数实际上也是一个指向函数对象的指针。函数通常使用声明语法定义。

函数创建方式:

  • 声明式 function sum(){}
  • 函数表达式 var sum = function(){}

js解析器会先读取函数声明,并使其在执行任何代码之前可以访问。而函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。

函数的内部属性

普通函数【箭头函数除外】内部 有两个特殊的属性argumentsthis

  • arguments 保存函数参数
  • this this引用的是函数执行的环境对象
    • use strict 模式,未指定环境对象调用函数时,this的值不会是window,除非明确把函数添加到某个对象或者调用apply()或者call(),否则this的值将一直是undefined。
    • 通过call()apply()bind() 方法可以绑定指定的this.
    • call()参数是单个单个传,apply()参数是数组形式传
  • callee 指向拥有arguments对象的函数,一般阶乘函数会用到。
2020_07_24_hUFmnP
2020_07_24_hUFmnP

js普通函数和箭头函数的区别

箭头函数

  1. 不能作为构造器函数使用,即不能使用new 关键字
  2. 不能绑定arguments
  3. 会捕获其所在上下文的this值,作为自己的this值;
  4. call()、apply()、bind() 不能改变this的指向
  5. 箭头函数不能使用argumen对象,该对象在函数体内不存在。如果要用,可以用rest参数代替
  6. 变量提升:由于js的内存机制,function的级别最高,而用箭头函数定义函数的时候,需要var(let、const)关键字,而var所定义的变量不能得到变量提升。故箭头函数一定要定义于调用之前。
  7. 箭头函数不能使用yield命令,因此箭头函数不能用作genertor函数。

this 指向问题

  1. 普通函数中,this指向其函数的直接调用者;

    1. 普通函数的默认绑定规则是:在非严格模式下,默认绑定的this指向全局对象,严格模式下this指向undefined
  2. 箭头函数中

    1. **this指向在定义的时候继承自外层第一个普通函数的this。任何方法都改变不了其指向,如call()、bind()**等;

    2. 被继承的普通函数的this指向改变,箭头函数的this指向会跟着改变

    3. 箭头函数外层没有普通函数,严格模式和非严格模式下它的this都会指向window(全局对象)

  3. 构造函数中,如果不使用new,则this指向window,如果使用new创建了一个实例,则this指向该实例

本文使用 mdnice 排版