回顾

接口:描述对象有哪些属性。

类:描述对象有哪些属性。

函数/方法:特殊的对象,可以被调用。

如果一个函数是一个东西的属性,它就是方法。

函数

function hi(){}
let hi2 = function(){} // 匿名函数
let hi3 = ()=>{} // 箭头函数

在 TypeScript 里的函数示例:

function hi(name:string, age:number=18):string|arguments{
  if(age>18){
    return 'hi';
  }else{
    return 404;
  }
}

一个变量(如上面的 hi,hi1,hi2)永远存的是函数的地址而不是函数。

function hi(){
  return 'hi'
}

hi = 123;
console.log(hi) // 123

this 和 arguments

任何函数都内置了 this 和 arguments。

function add(a:number, b:number = 1):number|string {
  'use strict'
  console.log(this)
  console.log(arguments)
  return a + b
}
function add(a:number, b:number):number {
  // 上面是形式参数
  return a + b
}

add(1,3)
// 上面是实际参数
function add(a:number,b:number):number{
  console.log(arguments.length)
  return arguments[0]+arguments[1]
}
function printThis(){
  'use strict'
  console.log(this)
  console.log(arguments)
}

printThis(1,2)

this 非严格模式下默认是 window(在浏览器里) 或者是 global(在 node.js 里)。

this 在严格模式下默认是 undefined。

用了call,this 是什么一目了然。

printThis.call('this is this',1,2)

在一个对象里,谁调用函数,谁就是this。

let obj={
  fn(){
    console.log(this)
  },
  obj2:{
    fn2(){
      console.log(this)
    }
  }
}

obj.fn() // obj
obj.obj2.fn2() // obj2
let fn3 = obj.fn
fn3() // window,如果严格模式下是 undefined

重要的话

this 就是 call 的第一个参数。

fn(1,2) 
// 等价于
fn.call(undefined, 1,2)

obj.fn(1,2)
// 等价于
obj.fn.call(obj, 1, 2)