函数进阶

函数的定义方式

  • 函数声明
  • 函数表达式
  • new Function

函数声明

function foo () {

}

函数表达式

var foo = function () {

}

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

  • 函数声明必须有名字
  • 函数声明会函数提升,在预解析阶段就已创建,声明前后都可以调用
  • 函数表达式类似于变量赋值
  • 函数表达式可以没有名字,例如匿名函数
  • 函数表达式没有变量提升,在执行阶段创建,必须在表达式执行之后才可以调用
如下,定义一个函数的例子:
if (true) {
  function f () {
    console.log(1)
  }
} else {
  function f () {
    console.log(2)
  }
}

以上代码执行结果在不同浏览器中结果不一致。

通过函数表达式的方式就可以解决以上问题:

var f

if (true) {
  f = function () {
    console.log(1)
  }
} else {
  f = function () {
    console.log(2)
  }
}

函数的调用方式

  • 普通函数
  • 构造函数
  • 对象方法

函数内this指向的不同场景

函数的调用方式决定了this的指向不同:

调用方式

非严格模式

备注

普通函数调用 window 严格模式下是undefined
构造函数调用 实例对象 原型方法中this也是实例对象
对象方法调用 该方法所属对象 紧挨着的对象
事件绑定方法 绑定事件对象  
定时器函数 window  

以上就是对函数内部this指向的基本整理