|
一、this指向構造函數實例化對象
在上篇文章中,我們提到了使用new和不使用new調用構造函數的區別,如下例:
復制代碼 代碼如下:
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);
當構造函數當做普通函數被調用時,并沒有返回值,同時this指向全局對象。那么我們如何來避免因為缺少new關鍵字,而產生的問題呢?
復制代碼 代碼如下:
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自動調用構造函數,并實例化,這意味著,我們不再需要擔心,遺漏new關鍵字實例化構造函數。當然這樣我們可能會養成一個壞的習慣,如果避免這種現象呢?我們可以拋出一個錯誤,像下面這樣:
復制代碼 代碼如下:
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指向調用該函數的對象
看下面的例子:
復制代碼 代碼如下:
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指向全局對象
在上面討論構造函數的時候我們也討論到不適用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());
在使用閉包的時候,作用域發生變化,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始終指向函數調用時的對象。
四、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函數 主站蜘蛛池模板: 欧美末成年videos丨 | 2020年国产精品午夜福利在线观看 | 亚洲 欧美 国产 综合 在线 | 特黄特色大片免费播放器9 特黄特黄aaaa级毛片免费看 | 中文字幕一区中文亚洲 | 伊人久久大香线蕉综合网站 | 爱穿丝袜的麻麻3d漫画免费 | 麻豆国产96在线日韩麻豆 | 亚洲AV精品无码喷水直播间 | 无人区日本电影在线观看 | 久久视频这有精品63在线国产 | 日韩亚洲欧洲在线rrrr片 | 有码 亚洲 制服 国产 在线 | 一区二区视频在线观看高清视频在线 | 国产高清精品自在久久 | 午夜宅宅伦电影网 | a级全黄试频试看30分钟 | 99精品免费久久久久久久久蜜桃 | 极品少妇高潮啪啪无码吴梦 | 天天操天天干天天爽 | free性中国hd护士高清 | 亚洲欧美一级久久精品 | 色婷婷综合久久久久中文一区二区 | 青青青草免费 | 免费观看美女的网站 | 美女张开大腿 | a级毛片黄免费a级毛片 | 伊人yinren6综合网色狠狠 | 狠狠色在在线视频观看 | 秋秋影视午夜福利高清 | 女配穿书病娇被强啪h | 久久天堂网 | 青青青青青青青草 | 亚洲精品一线二线三线无人区 | 亚洲精品蜜桃AV久久久 | 国产麻豆精品传媒AV国产在线 | 成人免费网址在线 | 日本邪恶全彩工囗囗番海贼王 | 毛片免费观看的视频在线 | 四虎国产精品免费观看视频 | 免费国产成人高清在线看软件 |