JavaScript中的this指向


this是誰

  技術一般水平有限,有什么錯的地方,望大家指正。

  this代指當前對象super調用父類的構造函數,應表會運網數物,加載驅動建立鏈接執行SQL處理結果,直到現在每想起這三點就能想起我上大學的時候,故事背景都是不同的有時候是我玩的正high的時候有時候是我快要睡覺,但是結果都是一致的就是讓老師教育幾句。現在就介紹一下Javascript中的this。

  說this的我們一般都說指向,代表,因為它不是固定的,今天是王麻子明天可能就是二狗子,它是誰不能確定,但是有一點是肯定的它永遠指向讓它起作用的那個對象。

  在全局作用域中this就是window,打開瀏覽器this===window會打印true,this只能存在兩個地方第一個就是全局對象中,第二個就是函數內。當然了所有的都是一樣的不是在函數里面就是在函數外面沒有別的~。

  在函數外面this就是window這是不變的,在函數里面this就是多變的了,但是this永遠是調用函數的那個對象。

  var name = "sky";
  var obj = {
      name:"zt",
      say:function(){
          console.log("I am "+this.name);
      }
  }
  obj.say();//I am zt
  var fn = obj.say;
  fn();//I am sky

  判斷函數里面的this指向誰就看函數調用的時"."符號左邊是誰,obj.say()"."左邊是obj所以this就是obj,say函數里面的this.name就是obj.name=>zt。fn()執行的時候沒有"."那么fn函數里面的this就是window,window.name=>sky,fn()其實就是window.fn(),只不過window可以省略,判斷this就是這么簡單,就看函數調用的時候"."左邊是哪個對象就可以。

  另外一點事件函數里面的this就是綁定事件的元素。

  this是靈活的當你用的不熟練的時候,他可能已經發生了改變,而我們卻沒有注意到:

  var name = "sky";
  var obj = {
      name:"zt",
      say:function(){
          setTimeout(function(){
              console.log("I am "+this.name);
          },0);
      }
  }
  obj.say();//I am sky

  你可能感覺say()的左邊是obj,所以say()里面的this就是obj了,對啊say()里面的this就是obj!仔細看this.name的外面還有一個function(){},this在這個函數里面所以這個函數是由誰調用的this才指向誰。我們在仔細梳理過程,obj.say()的結果就是創建一個定時器,在JS代碼執行完成之后定時器里面的函數執行,定時器里面的function(){}執行的時候沒有"."所以里面的this是指向window。

  函數里面的this指向誰,看函數執行的時候左邊是誰,當函數嵌套的函數的我們要有一種本能的反應,就是要注意this的指向。

  上面的這些多數的時候都是出現看面試題中,當然在開發中也要注意,this多用在構造函數中和new息息相關,我們先了解一下new的機制,new執行時會創建一個對象newObj,newObj的原型鏈指向構造函數的原型即newObj.__proto__ === 構造函數.prototype,並將構造函數里面的this指向新創建的對象,然后執行構造函數,最后返回newObj。所有如果需要暴露出去的一些屬性或者方法我們在構造函數中一定要作為this的屬性,這樣new出來的對象才能夠使用這些屬性。

function Demo(){
    this.des = "demo";
    var _life = "create";
}
var demo = new Demo();
console.log(demo.des)//demo
console.log(demo._lift)//undefined

this指向是可以被改變的

  函數中的this是可以被改變的:

  我們可以通過call、apply、bind指定函數運行時this的指向。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM