arguments相關

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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章