this:
存在全域的執行環境,也存在函式所開啟的執行環境
var myname = 'Tom';
function callname() {
}
callname();
影響函式this的調用方式:
1.簡易呼叫
2.作為物件方法
3.bind、apply、call方法
4.new (建構式)
5.DOM事件處理器
6.箭頭函式
var myname = 'Tom';
function callname() {
console.log(this.myname);
}
callname(); //Tom
var name = 'GlobalName';
(function () {
function foo() {
let name = 'Chupai';
console.log(this.name);
}
foo(); // "GlobalName"
})();
var name = 'GlobalName';
function foo() {
let name = 'Chupai';
console.log(this.name);
}
(function () {
foo(); // "GlobalName"
})();
var name = 'GlobalName';
function foo() {
let name = 'Chupai';
return function() {
console.log(this.name);
};
}
let myFoo = foo();
myFoo(); // "GlobalName"
備註:所謂Callback function把函式當作另一個函式的參數,透過另一個函式來呼叫它。
詳細可以參考重新認識 JavaScript: Day 18 Callback Function 與 IIFE
var name = 'GlobalName';
function foo() {
let name = 'Chupai';
function boo() {
console.log(this.name);
}
boo();
}
foo(); // "GlobalName"
var myname = 'Tom';
function callname() {
console.log(this.myname);
}
var family = {
myname: '小名家',
whosName: callname
};
family.whosName(); //小名家
解family.whosName():
var myname = 'Tom';
function callname() {
console.log(this.myname);
}
var family = {
myName: '小明家',
callName: callName,
Ming: {
myName: '小明',
callName: callName
}
}
family.callName(); //小明家
family.Ming.callName(); //小明
解:
var myName = 'TOM';
var family = {
myName: '小明家',
whoName: function () {
console.log(this.myName);
}
}
var herName = family.whoName;
herName();
解:
family.callName被賦予全域變數herName,而且並在全域環境呼叫,this從物件的範圍變更到全域的範圍,this.myName指向全域的var myName = 'TOM'。
var myName = 'TOM';
var family = {
myName: '小明家',
whoName: function () {
console.log(this.myName);
}
}
var herName = family.whoName;
herName;
解:
此時的this,是在物件下的屬性whoName呼叫,所以此時會指向this所屬物件的myName,就會出現小明家。
參考文章: