此文浅谈JavaScript函数中的一些属性和方法
在函数内部,有两个特殊的对象:arguments 和 this;
- this
函数在执行时,会在函数体内部自动生成一个this指针。谁直接调用产生这个this指针的函数,this就指向谁。 - arguments
它是一个类数组对象,包含着传入函数中的所有参数。arguments.length
参数的个数
function doAdd(){
if (arguments.length == 1) {
alert(arguments[0])
}
if (arguments.length == 2) {
alert(arguments[0] + arguments[1])
}
}
doAdd(10) //10
doAdd(10,20) //30
虽然JavaScript没有重载,但是可以利用arguments模拟重载;
- callee
callee是arguments的一个属性,是一个指针,指向拥有这个arguments对象的函数;
//递归函数的新写法,利用callee 消除紧密耦合的现象
function factorial(num){
if (num <1){
return 1;
}else {
retun num * arguments.callee(num-1) //num * arguments.callee 也就是factorial函数
}
}
var myFactorial = factorial;
//这样factorial在以后都可以使用,不影响factorial函数的结果
- caller
caller是函数对象的属性,这个属性保存着调用当前函数的引用
function outer() {
inner()
}
function inner() {
alert(inner.caller)
}
outer()
以上代码执行的结果是 outer() 函数的源代码,因为outer()调用了inner() ,所以inner.caller 就指向 outer; 为了实现更松散的耦合,也可以通过arguments.callee.caller 访问相同的信息
function outer() {
inner()
}
function inner() {
alert(arguments.callee.caller)
}
outer()
严格模式下,不能为函数的caller属性赋值,否则会出错;
- **apply() 和 call() **
函数的很多方法都是通过继承prototype
属性而来的,每个函数都有两个非继承而来的方法call()
和apply()
;它们实际上等于设置函数体内this对象的值
apply()
接收两个参数,第一个是this,第二个参数数组,可以是Array的实例也可以是arguments对象;
function sum(num1,num2){
return num1 + num2;
}
function applySum(num1,num2){
return sum.apply(this,arguments) //第二个参数也可以是 [num1,num2]
}
applySum(10,20) //30
call()
接收两个参数,第一个是this,第二个参数是传递给函数的参数,但参数必须逐个列举;
function sum(num1,num2){
return num1 + num2;
}
function callSum(num1,num2){
return sum.call(this,num1,num2)
}
callSum(10,20) //30
apply()
和 call()
真正强大的地方是能够扩充函数赖以运行的作用域;下面来看个例子
window.color = 'red'
var o = {color:'blue'}
function sayColor(){
alert(this.color)
}
sayColor() //red 因为this指向的是window 全局作用域
sayColor.call(this) //red 因为this指向的是window 全局作用域
sayColor.call(window) //red 因为设置this指向window,指向的是window 全局作用域
sayColor.call(o) //blue 因为设置this指向o,指向的是od对象
总的来说 apply() 和 call() 实际上等于设置函数体内this对象的值;能够扩充函数赖以运行的作用域;
- bind()
bind() 这个方法会创建一个函数的实例,其this值会被绑定到传给bind() 函数的值;bind(this),bind和call的区别是它不会调用,要调用还有加(),例如fn.bind(obj).(2,3)
window.color = 'red'
var o = {color:'blue'}
function sayColor(){
alert(this.color)
}
var objectSayColor = sayColor.bind(o)
objectSayColor(); //blue
在这里,sayColor() 调用bind() 并传入 对象o, 创建了一个函数实例objectSayColor();实例objectSayColor()函数的this值等于o;也就是说bind()会创建一个函数实例,然后把这个函数实例的this值设置为bind方法里面的参数;