Javascript this 關(guān)鍵字 詳解
一、this指向構(gòu)造函數(shù)實例化對象
在上篇文章中,我們提到了使用new和不使用new調(diào)用構(gòu)造函數(shù)的區(qū)別,如下例:
function Benjamin(username, sex) {
this.username = username;
this.sex = sex;
}
var benjamin = new Benjamin("zuojj", "male");
//Outputs: Benjamin{sex: "male",username: "zuojj"}
console.log(benjamin);
var ben = Benjamin("zhangsan", "female");
//Outputs: undefined
console.log(ben);
當構(gòu)造函數(shù)當做普通函數(shù)被調(diào)用時,并沒有返回值,同時this指向全局對象。那么我們?nèi)绾蝸肀苊庖驗槿鄙賜ew關(guān)鍵字,而產(chǎn)生的問題呢?
function Benjamin(username, sex) {
//Check whether "this" is a "Benjamin" object
if(this instanceof Benjamin) {
this.username = username;
this.sex = sex;
}else {
return new Benjamin(username, sex);
}
}
var benjamin = new Benjamin("zuojj", "male");
//Outputs: Benjamin{sex: "male",username: "zuojj"}
console.log(benjamin);
var ben = Benjamin("zhangsan", "female");
//Outputs: Benjamin {username: "zhangsan", sex: "female"}
console.log(ben);
在上例中,我們首先檢查this是否是Benjammin的實例,如果不是,使用new自動調(diào)用構(gòu)造函數(shù),并實例化,這意味著,我們不再需要擔心,遺漏new關(guān)鍵字實例化構(gòu)造函數(shù)。當然這樣我們可能會養(yǎng)成一個壞的習(xí)慣,如果避免這種現(xiàn)象呢?我們可以拋出一個錯誤,像下面這樣:
function Benjamin(username, sex) {
//Check whether "this" is a "Benjamin" object
if(this instanceof Benjamin) {
this.username = username;
this.sex = sex;
}else {
// If not, throw error.
throw new Error("`Benjamin` invoked without `new`");
}
}
二、this指向調(diào)用該函數(shù)的對象
看下面的例子:
var x = 10;
var obj = {
x: 10,
output: function() {
//Outputs: true
console.log(this === obj);
return this.x;
},
innerobj: {
x: 30,
output: function() {
//Outputs: true
console.log(this === obj.innerobj);
return this.x;
}
}
};
//Outputs: 10
console.log(obj.output());
//Outputs: 30
console.log(obj.innerobj.output());
三、this指向全局對象
在上面討論構(gòu)造函數(shù)的時候我們也討論到不適用new的時候,this會指向全局對象,下面我們來看看兩種常見的容易犯錯的實例:
var x = 100;
var obj = {
x: 10,
output: function() {
(function() {
//Outputs: true
console.log(this === window);
//Outputs: Inner: 100
console.log("Inner:" + this.x);
})();
return this.x;
}
};
//Outputs: 10
console.log(obj.output());
在使用閉包的時候,作用域發(fā)生變化,this指向window(瀏覽器中)。
var x = 100;
var obj = {
x: 10,
output: function() {
return this.x;
}
};
var output = obj.output;
//Outputs: 10
console.log(obj.output());
//Outputs: 100
console.log(output());
var obj2 = {
x: 30,
output: obj.output
}
//Outputs: 30
console.log(obj2.output());
此時this始終指向函數(shù)調(diào)用時的對象。
四、this指向apply/call()方法指派的對象
var x = 100;
var obj = {
x: 10,
output: function() {
return this.x;
}
};
//Outputs: 10
console.log(obj.output());
var obj2 = {
x: 40,
output: obj.output
}
//Outputs: 40
console.log(obj.output.call(obj2));
//Outputs: 10
console.log(obj2.output.apply(obj));
五、callback函數(shù)內(nèi)的this指向調(diào)用該callback的函數(shù)的this所指向的對象
//<input type="text" value="3" id="txt_username">
$("#username").on("click", function() {
console.log(this.value);
});
六、Function.prototype.bind中的this
The bind() method creates a new function that, when called, has its this keyword set to the provided value, with a given sequence of arguments preceding any provided when the new function is called.
實例一:
function person() {
return this.name;
}
//Function.prototype.bind
var per = person.bind({
name: "zuojj"
});
console.log(per);
var obj = {
name: "Ben",
person: person,
per: per
};
//Outputs: Ben, zuojj
console.log(obj.person(), obj.per());
實例二:
this.x = 9;
var module = {
x: 81,
getX: function() { return this.x; }
};
//Outputs: 81
console.log(module.getX());
var getX = module.getX;
//Outputs: 9, because in this case, "this" refers to the global object
console.log(getX);
// create a new function with 'this' bound to module
var boundGetX = getX.bind(module);
//Outputs: 81
console.log(boundGetX());
相關(guān)文章
JavaScript onkeypress事件入門實例(按下或按住一個鍵盤按鍵)
這篇文章主要介紹了JavaScript onkeypress事件入門實例,onkeypress事件捕捉按下或按住一個鍵盤按鍵的情況,需要的朋友可以參考下2014-10-10
深入理解JS函數(shù)的參數(shù)(arguments)的使用
下面小編就為大家?guī)硪黄钊肜斫釰S函數(shù)的參數(shù)(arguments)的使用。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-05-05
一篇文章告訴你JavaScript的作用域和函數(shù)該這樣理解
這篇文章主要為大家詳細介紹了JavaScript的作用域和函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
js實現(xiàn)日歷可獲得指定日期周數(shù)及星期幾示例分享(js獲取星期幾)
編寫一個簡易日歷。在文本框中輸入要查找的日期,程序可以計算出這一天處在該年份的第幾周,并且能判斷出這一天到底是星期幾,需要的朋友可以參考下2014-03-03
JavaScript基礎(chǔ)語法與數(shù)據(jù)類型介紹
這篇文章介紹了JavaScript基礎(chǔ)語法與數(shù)據(jù)類型,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-02-02
JavaScript操作數(shù)組的常用方法總結(jié)
這篇文章總結(jié)了JavaScript操作數(shù)組的常用方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06

