What's this?

一、apply、call 有什么作用,什么區(qū)別?

1.二者都屬于function.prototype的一個(gè)方法,以另一個(gè)對(duì)象替換當(dāng)前對(duì)象。
2.區(qū)別:

  • function.prototype.call()方法可以指定函數(shù)內(nèi)部this的指向,即函數(shù)執(zhí)行時(shí)所在的作用域。
var obj={};
var fn=function(){
   return this;
}
fn()===this; //true
fn.call(obj)===this; //false
fn.call(obj)===obj; //true

fn()執(zhí)行時(shí)所在的作用域是全局環(huán)境,所以this是window,而fn.call(obj)則是在對(duì)象obj環(huán)境下執(zhí)行的,所以此時(shí)的this指向obj。

  • funciton.prototype.apply()方法的作用與call方法類似,也是改變this指向,然后再調(diào)用該函數(shù)。唯一的區(qū)別就是,它幾首一個(gè)數(shù)組作為函數(shù)執(zhí)行時(shí)的參數(shù)。
function fn(x,y){ 
    return x+y;
}
fn.call(null,1,1); //2
fn.apply(null,[1,1]); //2

fn函數(shù)本來接收兩個(gè)參數(shù),使用apply方法之后,就變成可以接收一個(gè)數(shù)組作為參數(shù)。

二、以下代碼輸出什么?

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() 

結(jié)果:Johb:hi!

三、下面代碼輸出什么,為什么?

func();
function func() { 
  alert(this);
}

結(jié)果:[object Window]
原因:因?yàn)樵摵瘮?shù)是在全局環(huán)境window下執(zhí)行的。

四、下面代碼輸出什么

function fn0(){
    function fn(){
        console.log(this); //輸出的是window,因?yàn)閠his是在window下調(diào)用的
    }
    fn();
}
fn0();
document.addEventListener('click', function(e){
    console.log(this); //輸出的是document,因?yàn)檫@個(gè)是事件綁定,所以this指的是事件源DOM對(duì)象
    setTimeout(function(){
        console.log(this); //輸出的是window
    }, 200);
}, false);

五、下面代碼輸出什么,why?

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)

結(jié)果:John
原因:函數(shù)實(shí)例func調(diào)用的call方法,使其執(zhí)行環(huán)境在對(duì)象john下。所以函數(shù)func內(nèi)部的this指向john對(duì)象。

六、代碼輸出?

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

function func(a, b) { 
  alert( this[a] + ' ' + this[b] ) 
}
func.call(john, 'firstName', 'surname') 

結(jié)果:John Smith

七、以下代碼有什么問題,如何修改?

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么? 輸出的是&btn的dom對(duì)象
      this.showMsg();  //報(bào)錯(cuò),因?yàn)檫@里的this指向的還是&btn的dom對(duì)象,在dom對(duì)象中找不到showMsg(),所以報(bào)錯(cuò)
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

修改方法:

<body>
    <button class="btn">點(diǎn)擊</button>
    <script>
        var $btn=$(".btn");
        var module={
            bind:function(){
                $btn.on("click",function(){
                    console.log(this);
                    module.showMsg();
                })
            },
            showMsg:function(){
                console.log("饑人谷");
            }
        }
        module.bind();
    </script>
</body>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式。簡(jiǎn)單...
    舟漁行舟閱讀 8,110評(píng)論 2 17
  • 目錄1.this究竟是什么2.綁定this的方法3.caller、arguments和callee 1.this究...
    犯迷糊的小羊閱讀 712評(píng)論 0 0
  • 單例模式 適用場(chǎng)景:可能會(huì)在場(chǎng)景中使用到對(duì)象,但只有一個(gè)實(shí)例,加載時(shí)并不主動(dòng)創(chuàng)建,需要時(shí)才創(chuàng)建 最常見的單例模式,...
    Obeing閱讀 2,311評(píng)論 1 10
  • 問答 1、apply、call 有什么作用,什么區(qū)別 apply和call的作用:都是為了改變函數(shù)內(nèi)部的this指...
    StarLikeRain閱讀 475評(píng)論 0 0
  • 三、閉包和高階函數(shù) 3.1 閉包 3.1.1 變量的作用域 所謂變量的作用域,就是變量的有效范圍。通過作用域的劃分...
    梁同學(xué)de自言自語閱讀 1,545評(píng)論 0 6

友情鏈接更多精彩內(nèi)容