匿名函数做递归,使用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