JavaScript基础16--函数进阶

函数进阶

函数的定义方式

  • 函数声明
  • 函数表达式
  • 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

函数也是对象

  • 所有函数都是 Function 的实例
//可以通过new Function 的方式创建一个函数
//语法 new Function ([arg1[, arg2[, ...argN]],] functionBody)
// new Function ('形参1','形参1','形参1', '函数体')
//1.一个参数都不传的情况  创建的就是一个空的函数
//2.只传一个参数的情况 这个参数就是函数体
//3.传多个参数的情况,最后一个参数为函数体,前面的参数都是该函数的形参名
var sum = new Function('a', 'b', 'return a + b');
console.log(sum(2, 6));

你可能感兴趣的:(web前端,JavaScript)