this相關問題

1、apply、call、bind有什么作用,什么區別?

  • bind

Function.prototype.bind()作為內建對象Function原型的的一個方法,bind()方法創建一個新的函數,當被調用的時候,其this關鍵字設置為提供者的值,調用新函數時,在任何提供之前提供一個給定的參數序列。

語法:fun.bind(thisArg[,arg1,aeg2...])

demo

  this.x = 9   //window.x =9 
  var module = {
    x:81,
    getX: function(){
      console.log(this.x);
    }
  }
  module.getX();     //返回81,this指向module對象
  
  var retrieveX =   module.getX
  retrieveX();      //返回9,this指向全局作用域  

  //創建一個新的函數,將"this"綁定到module對象
  var boundGetX =  retrieveX.bind(module);
  boundGetX();   //返回81,通過bind()方法改變this的指向
  • callapply

call()方法的作用和apply()類似,只有一個區別,就是call()方法接受的是若干個參數的列表,而apply()方法接受的是一個包含多個參數的數組。

call()語法:fun.call(thisArg[, arg1[, arg2[, ...]]])

call-demo

//使用call方法調用匿名函數
  var animals = [
    {species:'Lion',name:'King'},
    {species:'Whale',name:'Fail'}
  ]
  for(var i=0;i<animals.length;i++){
    (function(i){
      this.print = function(){
        console.log('#'+i+' '+this.species+ ' : ' + this.name)
      }
      this.print();
    }).call(animals[i],i);
  }

apply()語法:fun.apply(thisArg, [argsArray])

apply-demo

var numbers = [5,6,2,3,7,8]

var max = Math.max.apply(null,numbers)
var min = Math.min.apply(null,numbers)

console.log(max)
console.log(min)

2、

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

3、

func() ;   //Object window ,函數內的this在函數直接調用的時候在非嚴格模式下指向window
function func() { 
  alert(this)
}

4、

document.addEventListener('click', function(e){
    console.log(this);         //#document
    setTimeout(function(){
        console.log(this);     //window
    }, 200);
}, false);

5、

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)      //John,通過call將函數func的this綁定到了john對象上

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

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

修改:

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this)     //通過bind()方法將this綁定到module上
      this.showMsg();
    }).bind(module)
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • this 相關問題 1: apply、call 、bind有什么作用,什么區別 apply執行一個函數,傳入函數執...
    蛋黃肉閱讀 308評論 0 0
  • 問題1: apply、call 、bind有什么作用,什么區別? 作用:都是為了改變某個函數運行時的上下文(con...
    柏龍閱讀 219評論 1 6
  • 單例模式 適用場景:可能會在場景中使用到對象,但只有一個實例,加載時并不主動創建,需要時才創建 最常見的單例模式,...
    Obeing閱讀 2,103評論 1 10
  • 王冬向蘇純一詳細講述了事情的來龍去脈。蘇純一聽完王冬的講述,皺著眉頭陷入了沉思。過了許久,蘇純一站起身來,對王冬說...
    星空下的蝸牛閱讀 316評論 0 0
  • 我們學校的規定是放學一定要把孩子送到校門口,親自交到家長的手中。我們每天都重復著這樣做,看到孩子見到家長和我們說再...
    子皿悠悠閱讀 777評論 17 13