一,函數的相關屬性。
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