1. 程式人生 > >js中的call和apply簡單演示

js中的call和apply簡單演示

想象 規則 簡單 提升 道理 win 多重繼承 類型 時間

對於想要深入研究js的小夥伴們,call和apply好像就是基礎中的基礎,因為什麽呢?如果你好好看過jq還有一些新的框架,你就會發現,他們最底層的封裝方法就是各種回調。這樣的好處就是省去了開發者要寫大量代碼去封裝方法的時間,讓開發者記住調用的方法,拿過來就能用,什麽Agular,Vue.....其實扒開底褲,都是這些玩意,畢竟這些個框架沒有創造新語言,都是基於原生js來搞得,用js來搞,那麽你就得遵守js的原始規則,那麽call和apply這兩方法就是給了各個框架發揮想象力的空間了....

   好了說了這麽多,大道理也不多講了,直接上代碼吧

  

  

function aa(){


// (3)所以,aa中的this,指向bb
console.log(this)
this.say = function(n){
console.log(n)// ‘我是xx‘
}
}
function dd(){
console.log(this)
this.age = function(n){
console.log(n)// 33
}
}
// aa()在這裏調用,實際上是在window裏面進行了調用;
// 那麽aa中的this,就指向了window
// 因為:誰調用了函數,函數的this就指向誰。
// aa();
function bb(){
// (1)在這裏調用aa,你可以認為是在bb中調用了aa;
// (2)但其實是把bb的作用域,傳入了aa中,

aa.call( this );

// call一個對象,就是單純的繼承;
// call多個對象,就是多重繼承;
dd.call( this );
}

var cc = new bb();
cc.say(‘我是xx‘)
cc.age(22)

就是個簡單的小例子,這裏面有幾個關鍵的點,一個是aa和dd這兩個函數實際上只是提供了兩個方法而已,那麽通過new了一下bb這個函數,那麽aa,dd這兩個函數的作用域就傳到了bb這個函數中,第二個是通過傳值,那麽cc就可以調用bb裏的作用域,那麽cc.say(‘我是xx‘)就通過bb傳遞到aa函數裏的say對應得函數,並且調用了say的函數,同理,dd也是如此。apply和他類似就不多說只不過在傳值的時候是傳的數組,而不是其他類型。

  這樣通過call方法,你可以想象,如果你要作一個函數通用方法的封裝,那麽這就是個很好的解決方法,你可以定義很多方法,然後記住方法名字,當你想用這些方法的時候,只需要把bb這樣的函數new一下,賦值給一個變量,直接傳值就好了,多麽簡單,代碼的復用性得到質的提升!

js中的call和apply簡單演示