一,函数的相关属性。
function foo(x,y,z){
do something...
}
foo(1,2).
foo.length = 3;
foo.name = foo.
也就是说,函数的length属性,会返回该函数形参的数量
name属性返回函数名
二,arguments相关。
arguments是一个类数组对象,主要用途是保存函数参数。非严格模式下,跟函数的参数有绑定关系,比如下面中,
arguments[0]对应参数x,以此类推。
在上面的例子中,
function foo(x,y,z){
arguments[0] = 10;
arguments[1] = 100;
arguments[2] = 200;
}
foo(1,2);
但是foo(1,2)只传入了1,2两个参数,对应的z参数没有传入,就会与arguments失去绑定关系。然后参数1,2,被arguments变为了10,100.
此外,arguments还有一个属性callee,callee是一个指针,用来指向拥有这个arguments的函数对象。
上面的例子中,arguments.callee === foo //返回true
三,apply和call。
一个小例子,
function fn(x,y){
console.log(x,y,this)
}
fn.call(100,10,20) //10,20,Number(100)
fn.apply(null,10,20) // 10,20, window
fn.apply(undefined,1,2) //1,2,window
就是说,apply或call的第一个参数如果是null或undefined,this就会指向window。这是在非严格模式下的。
那如果是在严格模式下,this指向的就是null和undefined本身。
四,关于bind。
bind方法是ES5才提供的。IE9才支持、
举个小例子
this.x = 9;
var module = {
x:81,
getX:function(){return this.x}
}
那如果直接用module对象去调用getX方法
module.getX() //返回81
如果将该方法赋值给一个全局变量,
var get = module.getX;
get() //返回9 因为this指向了window
这个时候可以使用bind方法绑定module,在赋值给全局变量
var boundGetX = get.bind(module)
上面的例子使用call或apply行不通。
为什么呢?其实我也不知道。但是这三个方法的作用是一样的。都是用来绑定指定this的,
除了传参的方式apply不太一样。
这样写的时候call和apply起作用
get.call(module)
get.apply(module)
但是赋值给一个变量就不起作用了。想bind那么写。
然后bing想call这样写也不起作用。
get。bind(module)好像是会返回函数本身
此外,使用bind还有一个功能,就是科里化参数。比如
function fn(a,b,c){
return a+b+c;
}
var func = fn.bind(null,100)
func(1,2) //103
var func2 = fn.bind(null,100);
func2(1) //201