this

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

答:

  • this的指向:
    this是函數(shù)內(nèi)部的屬性,既可以是全局對(duì)象、也可以是當(dāng)前對(duì)象或者任意對(duì)象。但總有一個(gè)原則,指的是函數(shù)調(diào)用的那個(gè)對(duì)象。
    1.在全局調(diào)用的時(shí)候指向是window。
    2.作為對(duì)象的方法調(diào)用的時(shí)候指的是那個(gè)對(duì)象。
    3.構(gòu)造函數(shù)的時(shí)候指的是構(gòu)造出來(lái)的那個(gè)對(duì)象。
    4.在事件綁定中的this,指向調(diào)用事件綁定的document對(duì)象。
    5.函數(shù)嵌套中的function的this指向window。
    6.setTimeout和setlnterval中的this指向window。
apply與call的作用:

apply、call的作用是相同的,都是指定函數(shù)的this和參數(shù)來(lái)調(diào)用函數(shù),使用apply與call可以使this的指向更為清晰。
apply與call的區(qū)別,他們的區(qū)別在于傳遞給函數(shù)的參數(shù),apply接收的是數(shù)組的形式,call接收的是多個(gè)參數(shù)。
例子:

    var name = 'hello';
    var obj = {
        name: 'jirengu',
    };
    var obj1 = {
        name:'syc'
    };

    function sayName() {
        console.log(this.name)
    }
    //全局調(diào)用, 默認(rèn)指向window
    sayName()//輸出'hello'
    //作為obj的方法調(diào)用, 指向obj
    obj.sayName = sayName
    obj.sayName()//輸出'jirengu'
    //使用call指定this值
    sayName.call(obj1)//輸出'syc'

代碼:

1.以下代碼輸出什么?
var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() //輸出:John:hi!
2.下面代碼輸出什么,為什么
func() 

function func() { 
  alert(this)
}//輸出[object Window] 因?yàn)樗侨謱?duì)象調(diào)用的函數(shù),所以是window
3.下面代碼輸出什么
function fn0(){
    function fn(){
        console.log(this);
    }
    fn();
}

fn0();//這里是全局調(diào)用函數(shù)所以是Window


document.addEventListener('click', function(e){
    console.log(this);//這里的this指的是addEventListener的對(duì)象,所以是document
    setTimeout(function(){
        console.log(this);
    }, 200);
}, false);//這里的setTimeout是全局調(diào)用的函數(shù)所以是window

4下面代碼輸出什么,why
    var john = {
        firstName: "John"
    }

    function func() {
        alert( this.firstName )
    }
    func.call(john)
//結(jié)果是john,因?yàn)閏all指向了this為john
5.代碼輸出?
var john = { 
  firstName: "John",
  surname: "Smith"
}

function func(a, b) { 
  alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname') 
//結(jié)果為Jhon Smith因?yàn)閏all指定了傳入對(duì)象為john而且它可以傳入多個(gè)參數(shù),所以結(jié)果是這個(gè)。
6.以下代碼有什么問(wèn)題,如何修改
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //當(dāng)btm被點(diǎn)擊的時(shí)候this指的btn
      this.showMsg();
    })
  },
  showMsg: function(){
    console.log('饑人谷');
  }
}
//

問(wèn)題:this,showMsg()當(dāng)點(diǎn)擊$btn時(shí)this指的是btn而不是module,所以饑人谷將無(wú)法被打印。
修改:

var module= {
  bind: function(){
   var cur = this;
    $btn.on('click', function(){
      console.log(this) 
      cur.showMsg();
    })
  },
  showMsg: function(){
    console.log('饑人谷');
  }
}

本文由作者和饑人谷所有 轉(zhuǎn)載請(qǐng)注明出處。

最后編輯于
?著作權(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)容

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