function Benjamin(username, sex) {
this.username = username;
this.sex = sex;
} " /> 玩弄放荡人妻一区二区三区,超碰在线视频97,乳液全集电影在线观看

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

Javascript this 關(guān)鍵字 詳解

一、this指向構(gòu)造函數(shù)實(shí)例化對象

在上篇文章中,我們提到了使用new和不使用new調(diào)用構(gòu)造函數(shù)的區(qū)別,如下例:

復(fù)制代碼 代碼如下:
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);

當(dāng)構(gòu)造函數(shù)當(dāng)做普通函數(shù)被調(diào)用時,并沒有返回值,同時this指向全局對象。那么我們?nèi)绾蝸肀苊庖驗(yàn)槿鄙賜ew關(guān)鍵字,而產(chǎn)生的問題呢?

復(fù)制代碼 代碼如下:
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的實(shí)例,如果不是,使用new自動調(diào)用構(gòu)造函數(shù),并實(shí)例化,這意味著,我們不再需要擔(dān)心,遺漏new關(guān)鍵字實(shí)例化構(gòu)造函數(shù)。當(dāng)然這樣我們可能會養(yǎng)成一個壞的習(xí)慣,如果避免這種現(xiàn)象呢?我們可以拋出一個錯誤,像下面這樣:

復(fù)制代碼 代碼如下:
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ù)的對象

看下面的例子:

復(fù)制代碼 代碼如下:
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會指向全局對象,下面我們來看看兩種常見的容易犯錯的實(shí)例:

復(fù)制代碼 代碼如下:
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(瀏覽器中)。

復(fù)制代碼 代碼如下:
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()方法指派的對象

復(fù)制代碼 代碼如下:
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ù)

主站蜘蛛池模板: 精品一区二区免费视频蜜桃网 | 蜜桃视频无码区在线观看 | 久久se视频精品视频在线 | 快播电影网址 | 国产精品女上位好爽在线短片 | 欧美ZC0O人与善交的最新章节 | 榴莲推广APP网站入口官网 | 国产成人综合95精品视频免费 | 亚洲国产综合人成综合网站00 | 亚洲一卡久久4卡5卡6卡7卡 | 欧美18精品久久久无码午夜福利 | x8国产精品视频 | 国产免费内射又粗又爽密桃视频 | www色小姐| 含羞草传媒在线观看 | 台湾果冻传媒在线观看 | 色欲国产麻豆一精品一AV一免费 | YELLOW高清在线观看2019 | 日韩欧美高清一区 | 99热在线视频这里只精品 | 4k岛国精品午夜高清在线观看 | 国产乱人偷精品视频A人人澡 | 胸太大被男同桌吃好爽 | 少妇大荫蒂毛多毛大 | 在线视频 国产 日韩 欧美 | 97SE亚洲国产综合自在线不卡 | 午夜性伦鲁啊鲁免费视频 | 亚洲人女同志video | 成 人 动漫3d 在线看 | 精品在线观看一区 | 久久国产欧美日韩精品免费 | 国产精品色欲AV亚洲三区软件 | 妈妈的朋友5在线观看免费完整版中文 | 91看片淫黄大片.在线天堂 | 怡红院美国分院一区二区 | 欧美日韩免费播放一区二区 | av女优快播 | 日本邪恶全彩工囗囗番海贼王 | 无码国产色欲XXXX视频 | 亚洲精品免费网站 | 思思久久99热只有频精品66 |