函数的执行

302 阅读1分钟

匿名函数做递归,使用arguments.callee

let i=0
(function(){
	i++
    if(i<3){
    	arguments.callee()
    }
})()

函数执行的三种方法

普通函数:调用这个函数,相当于window对象调用,函数里的this是指向window

作为方法调用:在对象里面的方法中的this是指向这个对象,外部声明的变量相当给window对象添加属性.

obj.say=test
obj.say()   //输出的this指向这个obj对象


test=obj.say
test()    //输出的this指向window对象

作为构造函数调用:构造函数内的this是指向这个构造函数,this是new关键字创建的对象

Person() //this是指向window对象

函数上下文调用模式

函数的三种基本调用模式(基本函数,方法,构造函数)都无法改变this的指向

我们如果想改变this的指向,我们要使用上下文调用模式(call(),apply(),bind())

call()

语法 : 函数名.call(this的指向,参数一,参数二,...)

apply()

函数名.apply(this指向的对象,数组或伪数组) apply()只携带两个参数

bind()

语法:函数名.bind(this的新指向),返回的是一个函数不会自已调用

call(),apply(),bind() 这三个方法是来自Function.prototype上的,所有函数都可以调用改变this的指向

如果传入的参数不是对象

  • 传入(122) this指向Number对象
  • 传入('dsad')this指向String对象
  • 传入的是false或true this指向Boolean对象
  • 传入的是undefined、null、空 this指向window