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

淺談對 this 指向的理解

在《javaScript語言精粹》這本書中,把 this 出現的場景分為四類,簡單的說就是:

有物件就指向呼叫物件;沒呼叫物件就指向全域性物件;用new構造就指向新物件;通過 apply 或 call 或 bind 來改變 this 的所指。

首先理解這句話:this物件是在執行時基於函式的執行環境繫結。

this引用是一種在JavaScript程式碼中隨時都可以使用的只讀變數,this引用的是一個物件。因此根據函式的呼叫方式不同,引用的物件也會有所不同。
this會根據程式碼的上下文語境自動改變其引用。
接下來看第一種情況:
1. 有物件就指向呼叫物件

var  name = "this is gloabal"
; var obj = { name : "my object", getName : function(){ return this.name; } } alert(obj.getName()); //my object

函式的執行環境在obj內,所以訪問的是obj.name;

2.沒物件呼叫就指向全域性物件

var name = " this is global";
function getName(){
    return this.name;
}
alert(gertName()); //this is global

3. 用new建構函式就指向新物件

function getObj(){
 console.log(this);    //控制檯輸出: getObj{}  
                       //this指向的新建立的getObj物件
    }
new getObj();
}

4. 通過 apply 或 call 或 bind 來改變 this 的所指。

var name = 'this is window';  //定義window的name屬性,看this.name是否會呼叫到
var testObj1 = {
    name : 'this is testObj1',
    getName:function
(){ console.log(this); console.log(this.name); } } var testObj2 = { name: 'this is testObj2' } //就相當於使testObj1.getName在testObj2的環境中執行。所以得到的是 this is testObj2 testObj1.getName.apply(testObj2); //控制檯輸出: this is testObj2 testObj1.getName.call(testObj2);

最後有一種情況:

var obj={
    name:'this is obj',
    getname:function(){
        return function(){
            return this.name;
        }
    }
}
alert(obj.getname()());

obj.getname()執行返回的是一個 函式,兩個括號就是要執行返回的函式。因為該函式是在windows作用域中執行的,
所以 這個this物件 指向的是windows作用域 而非 obj的作用域。

var name = "this is global";
    var myObject = {
    name : "my object",
    getValue: function(){

        var foo = function(){
            alert(this.name);
            }
        foo();
    }
}

myObject.getValue();   //this is global

在上述程式碼塊中,foo 函式雖然定義在 getValue 的函式體內,但實際上它既不屬於 getValue 也不屬於 myObject。foo 並沒有被繫結在任何物件上,所以當呼叫時,它的 this 指標指向了全域性物件 global。

varname=’this is windows’;
varobj={
name:’this is obj’,
getname:(function(){
alert(this.name)
})();
}
同樣 該程式碼 彈出 this is windows;

因為 getname函式會在頁面載入的時候就執行,
而執行環境是在windows下執行的,所以this 指向的就是windows作用域。
千萬不要理解為 寫在obj體裡就認為this物件肯定指向obj體。。這是錯誤的。。
this物件是在執行時基於函式的執行環境繫結。

相關推薦

this 指向理解

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

this理解

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

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(變量);

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

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

handle的理解

handler是Android中重要的訊息機制,我們在平常的開發中也是經常接觸到的,下面是我個人總結的一些觀點和理解,希望和大家分享一起討論。 首先呢,Handler的主要工作是採用當前執行緒的Loo

Spring的理解

Spring框架是一個為Java應用程式的開發提供了綜合、廣泛的基礎性支援的Java平臺。 Spring是一個十分龐大的體系,具

後綴自動機的一點理解

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

二分思想的理解

搜索問題 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關鍵字就指定了使用哪一種雜湊

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