笔记-js高级程序设计-5.引用类型-Function

113 阅读2分钟

函数定义的三种方式

函数声明

function sum (num1, nunm2){
  return num1 + num2
}

函数表达式

var sum = function(num1, nunm2){
  return num1 + num2
}

Function构造函数

Function构造函数接受任意个数参数,最后一个参数会被看作函数体,不推荐使用这种方式创建方法。

var sum = new Function('num1', 'nunm2', 'return num1 + num2')

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

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

函数内部属性

arguments

  1. 类数组对象,用于保存传入函数的所有参数,该对象有一个callee属性,指向该函数。
  2. js中的函数没有重载,因为对于参数个数本来就没有限制

this

谁调用这个函数,this就指向谁。

函数有一个caller属性,指向调用当前函数的函数,全局调用为null。

函数属性和方法

  1. length: 函数希望接受的命名参数的个数
  2. prototype: 原型

apply,call,bind

  1. apply: 在特定作用域中调用函数,实际等于设置函数体内this对象的值。 接收两个参数,一个是重新指向的作用域,一个是参数数组。
  2. call: 同apply方法,只是接收的参数不再是参数数组,而是将函数的参数逐个列举出来。
window.color = 'red'
var o = {color: 'blue'}
function sayColor(){
  alert(this.color)
}
sayColor()   //red
// 利用apply或者call可以让全局方法作用于对象o,而不必在o上面再定义一个sayColor对象,扩展了函数作用域。
sayColor.call(o)   //blue
  1. bind:该方法会创建一个函数的实例,其this的值会被绑定到传给bind()函数的值。
window.color = 'red'
var o = {color: 'blue'}
function sayColor(){
  alert(this.color)
}
// 创建出来的oSayColor方法,其中的this值指向o
var oSayColor = sayColor.bind(o)
oSayColor()   //blue

apply和call调用之后会直接指向函数,而调用bind不会执行函数,而是创建了一个this指向不同的新函数。