- 在ES6之前,函數內部的this是由函數的調用方式決定的
- 函數調用
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。
- 方法調用
var age = 18; var p ={ age : 15, say : function(){ console.log(this.age) } } p.say();
-
方法調用,結果為15,這里的this指向p對象。
- 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
- 上下文方式(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中箭頭函數)。