function Benjamin(username, sex) {
this.username = username;
this.sex = sex;
} " /> 美女张开腿让男人桶爽无弹窗,国产色精品久久人妻无码,秋霞鲁丝片Av无码

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

Javascript this 關鍵字 詳解

一、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函數

主站蜘蛛池模板: 无遮掩H黄纯肉动漫在线观看星 | 动漫美女无衣 | 国产精品久久久久久久A片冻果 | 亚洲精品无夜久久久久久久久 | 入禽太深在线观看免费高清 | 99午夜视频| 国产美女一区二区 | 欧美午夜不卡在线观看 | 亚洲第一页视频 | 成人午夜精品无码区久久漫画日本 | 黄色a级免费网站 | 亚洲色视在线观看视频 | 亚洲视频欧美视频 | 男污女XO猛烈的动态图 | 国产成人精品视频频 | 青柠在线观看免费播放电影 | youjizz护士| 红尘影院在线观看 | 欧美亚洲国内日韩自拍视频 | 成电影人免费网站 | 日本xxxx69动漫 | 小荡娃奶真大 | 菠萝菠萝蜜视频在线看1 | 中文字幕人妻无码系列第三区 | 337p啪啪人体大胆 | 灰原哀被啪漫画禁漫 | 亚洲久热无码中文字幕 | 日日噜噜夜夜躁躁狠狠 | 最新色导航 | 亚洲性无码av在线 | 久久精品麻豆国产天美传媒果冻 | 免费一区在线观看 | 亚洲一区日韩一区欧美一区a | 99久久综合 | 啊灬啊灬啊灬快灬深高潮啦 | 亚洲XXX午休国产熟女屁 | 野花韩国高清完整版在线 | 某上海少妇3P黑人完整版BD | 全免费a级毛片免费看 | 不用播放器的黄 | 国产成人精品永久免费视频 |