任務(wù)33-this

問答

1. apply枣耀、call 有什么作用芬位,什么區(qū)別

Javascript的每個(gè)Function對(duì)象中有一個(gè)apply方法:
function.apply([thisObj[,argArray]])
還有一個(gè)類似功能的call方法:
function.call([thisObj[,arg1[, arg2[, [,.argN]]]]])

  • 它們各自的定義:
    apply:應(yīng)用某一對(duì)象的一個(gè)方法武氓,用另一個(gè)對(duì)象替換當(dāng)前對(duì)象东帅。
    call:調(diào)用一個(gè)對(duì)象的一個(gè)方法岭埠,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象脆丁。

  • 它們的共同之處:
    都“可以用來代替另一個(gè)對(duì)象調(diào)用一個(gè)方法,將一個(gè)函數(shù)的對(duì)象上下文從初始的上下文改變?yōu)橛?thisObj 指定的新對(duì)象稚叹。

  • 它們的不同之處:
    apply:
    最多只能有兩個(gè)參數(shù)——新this對(duì)象和一個(gè)數(shù)組 argArray端礼。如果給該方法傳遞多個(gè)參數(shù)禽笑,則把參數(shù)都寫進(jìn)這個(gè)數(shù)組里面,當(dāng)然蛤奥,即使只有一個(gè)參數(shù),也要寫進(jìn)數(shù)組里面僚稿。如果 argArray 不是一個(gè)有效的數(shù)組或者不是 arguments 對(duì)象凡桥,那么將導(dǎo)致一個(gè) TypeError。如果沒有提供 argArray 和 thisObj 任何一個(gè)參數(shù)蚀同,那么 Global 對(duì)象將被用作 thisObj缅刽,并且無法被傳遞任何參數(shù)。
    call:
    則是直接的參數(shù)列表蠢络,主要用在js對(duì)象各方法互相調(diào)用的時(shí)候衰猛,使當(dāng)前this實(shí)例指針保持一致,或在特殊情況下需要改變this指針。如果沒有提供 thisObj 參數(shù)刹孔,那么 Global 對(duì)象被用作 thisObj啡省。

更簡單地說,apply和call功能一樣髓霞,只是傳入的參數(shù)列表形式不同:如 func.call(func1,var1,var2,var3) 對(duì)應(yīng)的apply寫法為:func.apply(func1,[var1,var2,var3])
也就是說:call調(diào)用的為單個(gè)卦睹,apply調(diào)用的參數(shù)為數(shù)組

function sum(a,b){
    console.log(this === window);//true
    console.log(a + b);
 }
 sum(1,2);
 sum.call(null,1,2);
 sum.apply(null,[1,2]);

作用  

  • 調(diào)用函數(shù)
var info = 'tom';
function foo(){   
    //this指向window 
    var info = 'jerry';
    console.log(this.info);   //tom
    console.log(this===window)  //true
}
foo(); 
foo.call();
foo.apply();
  • call和apply可以改變函數(shù)中this的指向
var obj = {
        info:'spike'
}
foo.call(obj);    //這里foo函數(shù)里面的this就指向了obj
foo.apply(obj);
  • 借用別的對(duì)象的方法
    eg:求數(shù)組中的最大值
var arr = [123,34,5,23,3434,23];
//方法一
var arr1 = arr.sort(function(a,b){
    return b-a;
});
console.log(arr1[0]);
//方法二
var max = Math.max.apply(null,arr)   //借用別的對(duì)象的方法
console.log(max);

代碼

1. 以下代碼輸出什么?

var john = { 
  firstName: "John" 
}
function func() { 
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()  // John: hi!,this指向調(diào)用sayHi()的john對(duì)象

2. 下面代碼輸出什么方库,為什么

func() 

function func() { 
  alert(this)    //window结序,因?yàn)樵诤瘮?shù)被直接調(diào)用時(shí)this綁定到全局對(duì)象。在瀏覽器中纵潦,window 就是該全局對(duì)象
}

3. 下面代碼輸出什么

function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0(); //window. 函數(shù)嵌套產(chǎn)生的內(nèi)部函數(shù)的this不是其父函數(shù)徐鹤,仍然是全局變量


document.addEventListener('click', function(e){
    console.log(this);  //#document.
                        //在事件處理程序中this代表事件源DOM對(duì)象
    setTimeout(function(){
        console.log(this);  //window.
                            //setTimeout、setInterval這兩個(gè)方法執(zhí)行的函數(shù)this也是全局對(duì)象
    }, 200);
}, false);

4. 下面代碼輸出什么邀层,why

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)    //John
                   //call(john)傳入了john這個(gè)執(zhí)行上下文返敬,this指向john這個(gè)對(duì)象

5. 代碼輸出?

var john = { 
  firstName: "John",
  surname: "Smith"
}

function func(a, b) { 
  alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname') //John Smith
                                        //this指向john這個(gè)對(duì)象

6. 以下代碼有什么問題被济,如何修改

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指$btn
      this.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}
//修改后:
var module= {
  bind: function(){
     var cur = this;  //將this代表的module存到cur
    $btn.on('click', function(){
      console.log(this) //$btn
      cur.showMsg(); //饑人谷
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

7. 下面代碼輸出什么

var length = 3;
function fa() {
  console.log(this.length); 
}
var obj = {
  length: 2,
  doSome: function (fn) {
    console.log(this)// obj
    fn();            //3.  函數(shù)嵌套的內(nèi)部函數(shù)this指向全局變量
    arguments[0]();  //1.  arguments對(duì)象在調(diào)用fa救赐,所以this指arguments對(duì)象。長度為1
  }
}
obj.doSome(fa)

8. 下面代碼輸出什么? why

obj = {
  go: function() { alert(this) }
}

obj.go();     //obj.  go是obj身上的一個(gè)方法只磷,就算放在全局環(huán)境下经磅,this依舊指向obj;

(obj.go)();  //obj.  這是一個(gè)自執(zhí)行函數(shù)钮追, 依舊是obj去調(diào)用了這個(gè)方法预厌;

(a = obj.go)(); //window
                //將函數(shù)賦值給一個(gè)全局變量a;這個(gè)時(shí)候a()執(zhí)行的話元媚,就變成了依賴的是全局環(huán)境轧叽,所以this指向了window苗沧;

(0 || obj.go)(); //window  
                 //相當(dāng)于 (temp = 0 || obj.go)(),即相當(dāng)于上一條例子

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市炭晒,隨后出現(xiàn)的幾起案子待逞,更是在濱河造成了極大的恐慌,老刑警劉巖网严,帶你破解...
    沈念sama閱讀 211,376評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件识樱,死亡現(xiàn)場離奇詭異,居然都是意外死亡震束,警方通過查閱死者的電腦和手機(jī)怜庸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來垢村,“玉大人割疾,你說我怎么就攤上這事〖嗡ǎ” “怎么了宏榕?”我有些...
    開封第一講書人閱讀 156,966評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胸懈。 經(jīng)常有香客問我担扑,道長,這世上最難降的妖魔是什么趣钱? 我笑而不...
    開封第一講書人閱讀 56,432評(píng)論 1 283
  • 正文 為了忘掉前任涌献,我火速辦了婚禮,結(jié)果婚禮上首有,老公的妹妹穿的比我還像新娘燕垃。我一直安慰自己,他們只是感情好井联,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,519評(píng)論 6 385
  • 文/花漫 我一把揭開白布卜壕。 她就那樣靜靜地躺著,像睡著了一般烙常。 火紅的嫁衣襯著肌膚如雪轴捎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評(píng)論 1 290
  • 那天蚕脏,我揣著相機(jī)與錄音侦副,去河邊找鬼。 笑死驼鞭,一個(gè)胖子當(dāng)著我的面吹牛秦驯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挣棕,決...
    沈念sama閱讀 38,933評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼译隘,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼亲桥!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起固耘,我...
    開封第一講書人閱讀 37,701評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤题篷,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后玻驻,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悼凑,經(jīng)...
    沈念sama閱讀 44,143評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,488評(píng)論 2 327
  • 正文 我和宋清朗相戀三年璧瞬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渐夸。...
    茶點(diǎn)故事閱讀 38,626評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡嗤锉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出墓塌,到底是詐尸還是另有隱情瘟忱,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評(píng)論 4 329
  • 正文 年R本政府宣布苫幢,位于F島的核電站访诱,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏韩肝。R本人自食惡果不足惜触菜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,896評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哀峻。 院中可真熱鬧涡相,春花似錦、人聲如沸剩蟀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽育特。三九已至丙号,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間缰冤,已是汗流浹背犬缨。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留锋谐,地道東北人遍尺。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像涮拗,于是被迫代替她去往敵國和親乾戏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迂苛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,494評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 單例模式 適用場景:可能會(huì)在場景中使用到對(duì)象,但只有一個(gè)實(shí)例鼓择,加載時(shí)并不主動(dòng)創(chuàng)建三幻,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,058評(píng)論 1 10
  • 問答 apply呐能、call 有什么作用念搬,什么區(qū)別? 在介紹apply和call之前摆出,我們先來看看this朗徊,this...
    小木子2016閱讀 274評(píng)論 0 0
  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情偎漫,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式爷恳。簡單...
    舟漁行舟閱讀 7,724評(píng)論 2 17
  • 問答 apply、call 有什么作用象踊,什么區(qū)別 apply()和call()函數(shù)都可以 指定this值和參數(shù)值的...
    ReedSun_QD閱讀 162評(píng)論 0 0
  • 問答 1.apply温亲、call 有什么作用,什么區(qū)別 關(guān)鍵句:this指的是調(diào)用函數(shù)的那個(gè)對(duì)象杯矩。apply,cal...
    鴻鵠飛天閱讀 239評(píng)論 0 0