javascript練習分析(一)

理解 Prototype.js的bind()函數

fun.bind(this,arg1,arg2)
bind()方法會創建一個新的函數,稱為綁定函數,fun方法在this環境下調用(這里的this可以綁定到任意對象),該方法可傳入連續多個參數,第一個參數作為this,第二個及以后的參數則作為函數的參數調用

// The .bind method from Prototype.js
Function.prototype.bind = function() {
    var fn = this, args = Array.prototype.slice.call(arguments), object = args.shift();
    return function() {
        return fn.apply(object,
        args.concat(Array.prototype.slice.call(arguments));
        )
    }
}
一.Array.slice()和shift()和concat()

slice()有兩種,一種是string.slice(),另外一種是Array.slice()。在數組Array中,slice()能夠基于當前數組中的一個或多個項創建一個新數組。它可以接受一個或兩個參數,即要返回項的起始和結束位置。在只有一個參數的情況下,slice()方法返回從該參數指定位置到當前數組末尾的所有項。如果有兩個參數,該方法返回起始和位置結束位置之間的項,但不包括結束位置的項, 且注意slice()方法不會影響原始數組
shift(): 刪除一個數組最前面的值,并且返回刪除值.
concat(): 可以基于當前數組中的所有項創建一個新數組。具體來說,這個方法會先創建當前一個數組的副本,然后接收到的參數添加到這個副本的末尾,最后返回新構建的數組。

var colors = ["red", "green", "blue", "yellow", "purple"];
var color1 = colors.concat("yellow",["black","brown"]);
var colors2 = colors.slice(1); 
var colors3 = colors.slice(1,4);
alert(color1);         //red,green,blue,yellow,purple,yellow,black,brown
alert(colors2);        //green,blue,yellow,purple
alert(colors3);        //green,blue,yellow
alert(colors);         //red,green,blue,yellow,purple
二. call()和apply()

call()和apply()方法主要是用來擴充函數的作用域(把第一個參數作為自己的this)
call()和apply()方法接收兩個參數:
apply(): 第一個參數是作用域,第二個是參數數組,其中第二個參數可以是數組實例,也可以是arguments對象。
call(): 第一個參數依舊是作用域,然而傳參的方式不同,其參數必須逐個寫入

三. Array.prototype.slice.call(arguments)

arguments是一個關鍵字,代表當前參數,在Javascript中雖然arguments表面上以數組形式來表示,但實際上沒有原生slice的功能,所以要使用call方法算是對arguments對象不完整數組功能的修正。
Array.prototype.slice.call(arguments) === Array.prototype.slice.call(arguments,0)
Array.prototype.slice調用的是Array的原型方法,對于真正的數組是有slice()方法,但是對于像arguments或者自己定義的一些類數組對象雖然存在length等若干屬性,但是并沒有slice()方法,所以對于這種類數組對象就得使用原型方法來使用slice()方法,即Array.prototype.slice.(如果在自定義中的類數組對象中自定義了slice()方法,就可以自然地直接調用了)。
因此,Array.prototype.slice.call(arguments,0)可以理解為:對于arguments類數組,我們調用Array.prototype.slice原型方法,并用call()方法將作用域限定在arguments中,此時:Array.prototype === arguments, 用參數0位slice()方法中地第一個參數,即開始位置索引,_通過這種方法就將arguments類數組轉換位了真數組。

var a = {
    length: 2,
    0: 'first',
    1: 'second'
};
Array.prototype.slice.call(a);    //["first","second"]
var a = {length: 2};
Array.prototype.slice.call(a);    //["undefined","undefined"] 
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容