一切对象由函数(构造)创建
----------------------------------------------函数也是对象----------------------------------------
函数也是通过类来创建的,通过Function来创建函数对象
函数是比较特殊的对象,函数的声明是引用数据类型,
--------------------------------------通过Function类创建一个函数-------------------------------
new Function()//可以创建出来的一个匿名对象
---------------------------------------通过Function类创建对象-------------------------------------
函数是对象,对象是属性的无序集合
常用的属性:arguments,length,name:”anonymous“
原型对象上的:apply bind call
一:CALL方法
------------------------------初步了解call方法--------------------
1)call是函数的原型对象上的方法
2)函数.call ,可以把这个函数调用了
3)f.call()f中的this表示window,(括号为空,this指向window)
4)f.call(obj) f中的this表示obj(括号里面是obj,this就会指向该对象)
要想通过obj调用f函数,怎么做?
方式一:把函数作为obj的属性,挂在obj上。
方式二:要想让这个函数不作为obj的属性。delete obj.该属性
方式三:使用call方法。f.call(obj)(表示让obj去借用f方法,f方法中的this就指向obj)
call方法的深入了解
f.call(obj):
表示两件事:执行f函数,让this的指向是obj
f.call目的是让f执行,并且改变f的this指向,所以说在js中this的指向是动态的,可以通过call进行改变。
// fn() 它里面的this表示window
// fn.call(); // fn中的this表示window
// fn.call(123) // fn中的this表示Number {123}
// fn.call("hello") // fn中的this表示String {"hello"}
// fn.call(true) // fn中的this表示Boolean {true}
// fn.call({}) // {}
//let obj={name:"xxx"}
fn.call(obj)//{name:"xxx"}
深入了解call方法的其他参数
call方法支持传参,从call方法的第二个参数开始就表示参数列表
例如:let r=fn.call(obj,1,2).
console.log(r)
总结:
1)call是函数原型对象上的属性
2)任何一个函数都可以.call
3)当一个函数.call时,这个函数被执行,函数中的this指向call中的第一个实参
4)如果call方法没有实参也能执行,只是函数中的this表示window。
5)如果第一个参数是null,在非严格模式下,函数中的this表示window,严格模式下,表示null
6)函数.call()时,函数肯定会执行,可以给函数传参,从call的第二个参数开始,会传给这个函数。