JavaScript中this指向問題(函數的調用方式)


  • 在ES6之前,函數內部的this是由函數的調用方式決定的
  1. 函數調用
var age = 18; var p ={ age : 15, say : function(){ console.log(this.age) } } var f1 = p.say; f1(); 
  •   這時是函數調用(是由window調用,即f1() = window.f1())。 
  •   此時結果為18,因為this指向window。 
  1. 方法調用
var age = 18; var p ={ age : 15, say : function(){ console.log(this.age) } } p.say(); 
  •   方法調用,結果為15,這里的this指向p對象。 
  1. new調用(構造函數)
	var age=18; var p={ age : 15, say : function(){ console.log(this.age); } } new p.say() 
  •   構造函數調用
    
  •   這時 p.say 屬於Object,為Object的實例 
  •   this:say構造函數的實例,實例中並沒有age屬性,值為:undefined 
  1. 上下文方式(call、apply、bind)
    function f1(){ console.log(this); } // call方法的第一個參數決定了函數內部的this的值 f1.call([1,3,5]) f1.call({age:20,height:1000}) f1.call(1) f1.call("abc") f1.call(true); f1.call(null) f1.call(undefined); 

上述代碼可以用apply完全替換

示例 2 var obj = { name: "西瓜", eat: function() { setInterval(function() { console.log(this.name); }, 100); }, hava: function() { setInterval((function() { console.log(this.name); }).bind(this), 100); }, small:function(){ setInterval(() => { console.log(this.name); }, 100); } }; 

總結: call方法的第一個參數: 1、如果是一個對象類型,那么函數內部的this指向該對象 2、如果是undefined、null,那么函數內部的this指向window 3、如果是數字-->this:對應的Number構造函數的實例 -- > 1 -- > new Number(1) 如果是字符串-- >this:String構造函數的實例 -- > "abc" -- > new String("abc") 如果是布爾值-- >this:Boolean構造函數的實例 -- > false -- > new Boolean(false) 在示例 2 中,依次為undefined, 西瓜,西瓜(ES6中箭頭函數)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM