国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

Javascript this 關鍵字 詳解

2024-05-06 16:10:01
字體:
來源:轉載
供稿:網友
Javascript是一種很靈活的語言, 而This關鍵字又是靈活中的靈活, 但是因為它的靈活, 也注定了它的難用.以前我用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函數內的this指向調用該callback的函數的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());

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 镇远县| 新巴尔虎右旗| 宁化县| 重庆市| 汝州市| 临桂县| 辰溪县| 田阳县| 海丰县| 海伦市| 曲水县| 黑山县| 洛川县| 南陵县| 云安县| 龙胜| 吉林市| 漠河县| 江华| 霍山县| 攀枝花市| 库伦旗| 乌拉特中旗| 苏尼特左旗| 大余县| 蒙城县| 班玛县| 张家界市| 枣庄市| 河津市| 宁河县| 田东县| 毕节市| 井冈山市| 台北县| 青冈县| 克什克腾旗| 禹城市| 广德县| 馆陶县| 错那县|