1. 程式人生 > >淺談對this的理解

淺談對this的理解

"this" 是個關鍵詞,是個存放指標的變數。

前提是在js中,別的語言我更不清楚了:

1、 this 預設指向 是   window

       e.g  

var name ='mongo';
console.log(this.name)       //  mongo
console.log(this)           // window

2、如果給元素添加了事件,當元素呼叫事件函式的時候, this 指向了 該 元素

       e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
      console.log(this)      //  oBtn 這個物件元素
}

3、如果給元素添加了事件,而該事件函式裡面又套了一層函式, 此時該元素呼叫 事件函式的時候, this 指向又發生了 變化, 指向了全域性 window

      e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
       setTimeout(function(){
               console.log(this) // window
        },1000)
}
       如果不包一層setTimeout,還可以加 return

       e.g

var oBtn = document.getElementById('btn');

oBtn.onclick = function(){
       return function(){
                console.log(this)   // window
        }
}

4、當遇到new 的時候, this 指向 了一個新的例項物件

       e.g

function Person(name){
      this.name = name;
      this.sayName = function(){
              console.log(this.name)
              console.log(this)
       }
}

var onePerson = new Person('mongo')
onePerson.sayName();    // ‘mongo’  onePerson例項物件
5、即便new 很厲害,但是遇到 call 或者apply 也認慫了! 此時的 this  會指向  call或者apply 裡面的第一個引數物件!

       e.g

var name = ‘mongo’;

function Person(name){
       this.name = name;
       this.sayName = function(){
               console.log(this.name)
               console.log(this)
        }
}

var onePerson = new Person('liulian');
onePerson.sayName().call('window')   // mongo  此時的this就指向了 全域性window

稍稍總結一下, this 是一個存指標的變數, this指向一直在變化, 為什麼會變化,應該是隨著上下文執行的環境變化而變化吧!  情況大概分為四種:

1、 誰呼叫了此函式, 那麼this 就指向誰

2、如果遇到函式裡面又包了一層函式,那麼 this的指向就變成全域性的了

3、 如果遇到new  那麼指向就是 新建立的例項物件

4、如果遇到call 或apply,那麼 this 指向就是 call或apply 裡面的第一個引數

相關推薦

this理解

"this" 是個關鍵詞,是個存放指標的變數。 前提是在js中,別的語言我更不清楚了: 1、 this 預設指向 是   window        e.g   var name ='mongo'; console.log(this.name) // mon

this 指向的理解

在《javaScript語言精粹》這本書中,把 this 出現的場景分為四類,簡單的說就是: 有物件就指向呼叫物件;沒呼叫物件就指向全域性物件;用new構造就指向新物件;通過 apply 或 call 或 bind 來改變 this 的所指。 首先理解這句話

後綴自動機的一點理解

字符串 變化 post .... 初始 mar 一起 樹狀 子集 後綴自動機入門詳解及模板

xmpp的理解及應用

mpp 通信 new xmpp times div log 傳輸數據 重新 參考原文鏈接 http://blog.sina.com.cn/s/blog_69f68f880102uyeg.html 一、xmpp是基於xml的協議。具有遵循標準,有安全性,使用TCP傳的xml的

NaN的理解

def 淺談 nan 理解 個數字 sna efi 數字 color 1.NaN : Not a Number 不是一個數字 2.NaN 與其他數值進行比較的結果總是不相等的,包括它自身在內 3.判斷是否是NaN, 方法一 :is.NaN(變量);

二分思想的理解

搜索問題 turn class 中一 不能 運算 color arch 因此 1、什麽是二分思想? 二分思想可以理解為是一種將一個大問題分成兩個子題,當每次分析完兩個子問題後,舍棄其中一個不符合條件的子問題,再將符合條件的子問題一分為二,反復循環搜索判斷的操作,直至找到所求

js閉包的理解

閉包就是能夠讀取其他函式內部變數的函式。由於在javascript中,只有函式內部的子函式才能讀取區域性變數,所以閉包可以理解成“定義在一個函式內部的函式“。在本質上,閉包是將函式內部和函式外部連線起來的橋樑。(引用了自由變數的函式) function f1(){ var a=10;

Js面向物件的理解(1)

    面向物件的語言有一個標誌,那就是它們都有類的概念,通過類來建立任意多個具有相同屬性和方法的物件。它是一種程式開發的方法,它將物件作為程式的基本單元,將邏輯和資料封裝其中,以提高程式碼的靈活性、重用性和擴充套件性。物件是把資料及對資料的操作方法放在一起,作為一個相互依存的整體。簡單的

web前端開發技術之HTML5 智能表單的理解

提示 goods 表單 加載完成 空格 日期和時間 url 顯示 指向 Html5新增input的form屬性,用於指向特定form表單的id,實現input無需放在form標簽之中,即可通過表單進行提交。 <FORM id=xinzeng> … </FO

IdentityServer4 access_token 的理解

IDS4伺服器通過JWT簽名(我覺得是私鑰簽名)生成access_token ,JWT包含了 1.header 用於描述元資訊,例如產生 signature 的演算法: { "typ": "JWT", "alg": "HS256" } 其中alg關鍵字就指定了使用哪一種雜湊

web前端技術基礎課程講解之soket的理解

淺談對soket的理解 定義: 網路上的兩個程式通過一個雙向的通訊鏈實現資料的交換,這個連結的一端就成為Socket 它是程序通訊的一種,即呼叫這個網路庫的api函式實現分佈在不同主機相關程序之間的資料交換,依照tcp/ip協議分給每個主機的網路地址,如果兩個主機要進行通訊,任何一個程序都要首先知道對方

Spring IOC容器的理解

看過很多關於Ioc容器的文章,自我理解。 首先,Ioc即“控制反轉”,是一種設計思想。 1、在Java開發中,Ioc意味著將你設計好的物件交給容器控制,而不是傳統的在你的物件內部直接控制。 2、傳統Java SE程式設計,我們直接在物件內部通過new進行建立物件,是程式

POW的認識和理解

目錄   一、理清POW:POW共識機制的原理 二、 工作量證明的優缺點 POW的優點 POW的缺點 三、 本人對POW存在問題的解決思路 一、理清POW:POW共識機制的原理 在區塊鏈中,核心的技術之一就是工作量證明機制(Proof-of-Work)。

---equals、hashCode、“==”的理解

在我們平常的學習中,經常會涉及到equals、hashCode、“==”這三者,對於這三者我經常混淆不清。因此,我自行總結了一下。 先說下在我們程式設計中用到的比較不容易區分的equals和hashCode的區別 equals和hashCode都是Object類

js原型鏈的理解

最近重新學習了一下JS原型鏈的知識,為了避免之後自己再忘記,在此記錄下自己對原型鏈的理解,歡迎大家一起討論交流 js中的物件分為函式物件與普通物件,函式物件有prototype與__proto__,普通物件只有__proto__,那麼怎麼區分這兩種物件呢? var f =

面向物件的理解(2)

面向過程與面向物件的區別: 面向過程是一種直接的程式設計方法,它是按照程式語言的思路考慮問題。通過順序執行一組語句來實現一個功能,這些語句的執行過程就是整個程式。 面向物件是一種抽象度更高的程式設計方法。它的目標是使模組的抽象度更高,目的是可複用。面向物件三大特性:封裝,繼承,多型。 面向過程可以說是從細節方

“面向物件”與“面向過程”的理解

面向過程,顧名思義是更注重過程。面向物件,是更注重物件。面向過程的實現過程是整個程式以步驟劃分,如五子棋第一步開始遊戲,第二步黑方先行等等。面向物件的實現過程是整個程式以物件劃分,以物件有什麼功能(方法)來實現,如五子棋分為黑白雙方、棋盤物件、規則物件。

執行緒池的理解

1、首先由幾個介面和類的關係是需要先說明的: extends   implementsextends Executor(介面)----------------->ExecutorService(介面)------------------->AbstractExe

# 新人hibernate的懶載入的理解

新人淺談對hibernate的懶載入的理解 懶載入是hibernate中常見的特性之一。 懶載入的好處: 可以減少程式本身因為與資料庫頻繁互動資料所導致的處理速度緩慢。 對懶載入異常的分析: 實驗程式碼如下: Department類: publ

Ubuntu桌面系統的實驗性理解

先宣告,我對Ubuntu桌面系統還理解不到位,只是對其中的桌面系統中的管理器和桌面環境說一下我我自己驗證的結果,有興趣的可以驗證一下,對於我自己很難去正確定義的名稱只是覺得可能這樣命名我都加了單引號去說明,如:‘桌面環境’,‘桌面管理器’首先正常裝的一個Ubuntu系統,不管