標籤:pre func 返回 cti 個數 私人屬性 就會 例子 改變
---恢複內容開始---
//首先這三個的根本作用都是改變this的指向,這個你必須明確先說call//首先用單列模式聲明一個對象;裡面有個fn的方法,很簡單,就是返回a裡面的name; var a = {name : ‘極速代碼‘,fn:function(){return this.name;} };a.fn() //-->輸出是 ‘極速代碼’ ,這個毫無疑問;var b = a.fn; //聲明一個對象b;讓他等於a裡面的這個fn方法;b(); //那麼這時候如果我們執行b();就會提示b這個方法不存在 b is not a function;為什嗎?原因是這樣的,name這個屬性是在a裡面的,a執行的時候this就是a本身,所以可以調用,而b()執行,這裡面的this就變成了b,所以無法調用a下面的name,所以我們要做的就是改變b方法執行的時候this的指向,讓它指向a,這麼做b.call(a)-->輸出 ‘極速代碼‘ 再舉個例子,大家肯定更加明白;聲明對象a,b,他們裡面都有一個叫name 的私人屬性; var a = {name : ‘極速代碼‘,fn:function(){return this.name;} };var b = {name:‘極速個啥‘}b.fn = a.fn//讓b裡面也有a裡面的fn;b.fn() //--->輸出的是 ‘極速個啥‘b.fn.call(a)-->輸出的是‘極速代碼’因為現在的this是指向a了。所以找到的是a裡面的name屬性;apply 跟call基本相似,只是apply只能最多傳2個參,第一個是this指向,第二個是一個數組;看例子:改變this指向跟call一樣,下面就說他們傳參的區別 var a = {name:‘極速代碼‘,fn:function(n,m){return this.name + n+m ;} };a.fn(1,3) //--輸出 ‘’極速代碼4‘’;這沒問題var b = a.fn;b(1,3) // 提示b is not a function,因為沒有改變this指向;b.apply(a,[1,3]) //-->輸出極速代碼4;b.call(a,1,3) // -->輸出極速代碼4;這兩個大家靈活運用,如果需要傳參是一個數組,或者很多就可以用apply;另外一點就是如果第一個參數沒有傳或者傳個null,this預設指向windowvar name = ‘極速代碼,極速個啥‘ var a = {name:‘極速代碼‘,fn:function(n,m){return this.name + n+m ;} } var b = a.fn b.call(null,1,3) //-->輸出"極速代碼,極速個啥13"this.指向了window,自然找的name是全域環境下的name;bind 也是改變this指向,跟call,apply有明星區別,bind顧名思義,就是把this指向改變,然後綁定,但沒有執行,看例子;var a = {name:‘極速代碼‘,fn:function(n,m){return this.name + n+m ;} };var b = a.fn;b.bind(a,1,3); //沒有輸出任何東西;因為只是改變了this指向,並沒有執行函數,b.bind(a,1,3)(); //輸出 ‘極速代碼13’到這裡相信大家對這三者有了一定的瞭解,一定要從本質上瞭解他們。
---恢複內容結束---
淺談call , apply ,bind 的 差異