1. 程式人生 > >【修真院web小課堂】簡述JS中this的指向

【修真院web小課堂】簡述JS中this的指向

 大家好,我是IT修真院北京總院第33期的學員劉仁瑞,一枚正直、純潔、善良的前端程式設計師今天給大家分享一下,修真院官網JS任務4深度思考中的知識點——JS中this的指向。

1、背景介紹

    我們在寫程式碼時候往往希望一個函式在不同環境下行為風格一致但是具體表現不一樣,這個時候就需要this出場了。

    this是javascript的一個關鍵字,是函式內部的一個特殊物件(或this引用);this在不同的上下文執行環境中指代不同的物件,所以我們可以用同樣的this程式碼輸出不同的結果,從而簡化程式碼。

1.1 THIS的特性

       會根據程式碼上下文語境自動改變其引用物件

this的指向在函式定義的時候是確定不了的,只有函式執行的時候才能確定this到底指向誰,實際上this的最終指向的是那個呼叫它的物件。

2.知識剖析

2.1 作為普通函式在全域性環境中被呼叫

       先上程式碼:

全域性環境中的普通物件

        這裡呼叫了a函式,而a函式的執行環境是全域性環境,這裡的this也就指向了全域性變數window。

        在全域性環境裡面,this 永遠指向 window,因此在全域性環境裡作為普通函式被呼叫的時候,this 也是指向 window。

2.2 作為物件的屬性被呼叫

先來個總結:如果函式作為一個物件的屬性方法,並且被呼叫的時候,那麼這個屬性方法中的this 就指向這個物件,來看程式碼:

但是當在在物件方法中再定義函式,這時候 this 又是 window

2.3 作為建構函式被呼叫

作為建構函式被呼叫的時候,this 代表它即將 new 出來的物件;如果不加 new,表示即作為普通函式呼叫,指向 window。

2.4作為 call/apply/bind 方法的呼叫

作為 call/apply/bind 方法被呼叫的時候指向傳入的值。

2.5  其他:setTimeout、setInterval中的this;建構函式 prototype 屬性; Eval函式;箭頭函式.。

3.常見問題

    1、this 遇到return怎麼辦呢?什麼意思呢,來看

        什麼意思呢?

        如果返回值是一個物件,那麼this指向的就是那個返回的物件,如果返回值不是一個物件那麼this還是指向函式的例項。

2、在嚴格模式下是什麼情況呢?

        在嚴格模式下,在全域性環境中執行函式呼叫的時候 this 並不會指向 window 而是會指向 undefined

3、什麼是嚴格模式?

        除了正常執行模式,ECMAscript 5添加了第二種執行模式:"嚴格模式"(strict mode)。顧名思義,這種模式使得Javascript在更嚴格的條件下執行。

設立"嚴格模式"的目的,主要有以下幾個:

- 消除Javascript語法的一些不合理、不嚴謹之處,減少一些怪異行為;

- 消除程式碼執行的一些不安全之處,保證程式碼執行的安全;

- 提高編譯器效率,增加執行速度;

- 為未來新版本的Javascript做好鋪墊。

        "嚴格模式"體現了Javascript更合理、更安全、更嚴謹的發展方向,包括IE 10在內的主流瀏覽器,都已經支援它,許多大專案已經開始全面擁抱它。

        另一方面,同樣的程式碼,在"嚴格模式"中,可能會有不一樣的執行結果;一些在"正常模式"下可以執行的語句,在"嚴格模式"下將不能執行。掌握這些內容,有助於更細緻深入地理解Javascript,讓你變成一個更好的程式設計師。

4.拓展思考

Q1:apply方法有什麼作用?一般在什麼情況下可以使用apply?

        apply:方法能劫持另外一個物件的方法,繼承另外一個物件的屬性.,call:和apply的意思一樣,只不過是引數列表不一樣.。

        在給物件引數的情況下,如果引數的形式是陣列的時候,比如apply示例裡面傳遞了引數arguments,這個引數是陣列型別,並且在呼叫Person的時候引數的列表是對應一致的(也就是Person和Student的引數列表前兩位是一致的) 就可以採用 apply , 如果我的Person的引數列表是這樣的(age,name),而Student的引數列表是(name,age,grade),這樣就可以用call來實現了,也就是直接指定引數列表對應值的位置(Person.call(this,age,name,grade));

Q2:ES6是什麼?

       ECMAScript 6(以下簡稱ES6)是JavaScript語言的下一代標準,在2015年6月正式釋出。

Q3:bind是幹什麼用的?什麼時候使用?

       bind()最簡單的用法是建立一個函式,使這個函式不論怎麼呼叫都有同樣的this值。場景就是在繫結函式,偏函式,settimeout等

Q4:什麼時候使用apply什麼時候使用call

       傳遞引數是陣列形式的時候用apply,反之使用call

5. 參考文獻

相關推薦

web課堂簡述JSthis指向

 大家好,我是IT修真院北京總院第33期的學員劉仁瑞,一枚正直、純潔、善良的前端程式設計師今天給大家分享一下,修真院官網JS任務4深度思考中的知識點——JS中this的指向。 1、背景介紹     我們在寫程式碼時候往往希望一個函式在不同環境下行為風格一致但是具體表現不一

WEB課堂自適應最螢幕時,該如何佈局。

自適應小螢幕裝置時,該如何佈局?分享人:宜康1.背景介紹隨著科技的發達,使用移動裝置諸如手機平板等獲取資訊,社交的人越來越多。如何在螢幕大小不同的物理裝置上獲得類似的使用體驗呢? 很多網站的做法是為不同大小的物理裝置提供不同的網頁。但是這樣做很麻煩,需要維護多個版本,不夠方便

web課堂原型

1.背景介紹 JavaScript 中,萬物皆物件。 JavaScript根據"原型鏈"(prototype chain)模式,來實現繼承。2.知識剖析2.1 物件JavaScript中,物件是有區別的,分為普通物件和函式物件,Object ,Function 是JS自帶的函

web課堂padding和margin的區別。

大家好,我是IT修真院西安分院第二期學員,一枚正直善良的web程式設計師。今天給大家分享一下,修真院官網CSS-1任務中可能會使用到的知識點:1.背景介紹什麼是MARGIN 什麼是PADDING我們在進行網頁製作時都會遇到為元素設定邊距的情況,邊距又分為內邊距和外邊距,即ma

java課堂MemCache和Redis的區別

大家好,我是IT修真院西安分院第三期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務六,深度思考中的知識點——MemCache和Redis的區別 一、背景介紹 Memcache和Redis Memcache :是 danga.co

java課堂REDIS快取叢集介紹

大家好,我是IT修真院西安分院第三期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務六,深度思考中的知識點——REDIS快取叢集介紹 一、背景介紹 Redis: Redis 是一個開源(BSD許可)的,記憶體中的資料結構儲存系統

java課堂什麼是jsp?

大家好,我是IT修真院鄭州分院第11期的JAVA學員周巨集浩,一枚正直純潔善良的java程式設計師。 今天給大家分享一下,什麼是jsp?。 1.背景介紹 JSP全名為Java Server Pages,中文名叫java伺服器頁面,JSP是一種動態頁面技

java課堂shiro 的簡單介紹

大家好,我是IT修真院武漢分院第十五期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務十的一個知識點:shiro 1.背景介紹 什麼是Apache Shiro? Apache Shiro(讀作“sheeroh”,即日語“城”

java課堂什麼是RMI,什麼是RPC,兩者之間的區別是什麼?

大家好,我是IT修真院北京分院第34期的學員嶽曉鵬,一枚正直純潔善良的java程式設計師,今天給大家分享一下,修真院官網java任務八,深度思考中的知識點——什麼是RMI,什麼是RPC,兩者之間的區別是什麼? (1)背景介紹: RMI Java遠端方法呼叫,即Java

java課堂什麼是一致性雜湊

大家好,我是IT修真院北京分院JAVA學員,一枚正直純潔善良的java程式設計師。 今天給大家分享一下,什麼是一致性雜湊 1.背景介紹 一致性雜湊概述 一致性雜湊演算法在1997年由麻省理工學院提出(參見擴充套件閱讀[1]),設計目標是為了解決因特網中的熱點(Hot

JAVA課堂什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置?

大家好,我是IT修真院深圳分院第十一期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務十的一個知識點:什麼是SpringCloudBus?如何使用SpringCloudBus實現自動更新配置? 1    背景介紹1.1    S

java課堂什麼是序列化和反序列化,在RMI是否要實現 SERIALIZABLE 介面, SERIALVERSIONUID的用處是什麼?

8.更多討論 1、serialVersionUID實際作用 假設本地資料庫中儲存了大量的user物件,後來由於需求,要修改User類中的屬性;如果不設定SerialVersionUID,根據屬性方法等自動生成,就會出現程式碼演示中的錯誤,造

JAVA課堂redis快取叢集簡單介紹

大家好,我是IT修真院鄭州分院第11期的JAVA學員,一枚正直純潔善良的java程式設計師。 今天給大家分享一下,redis快取叢集簡單介紹。 1.背景介紹 redis是一個key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括s

JAVA課堂如何使用分散式配置中心?

大家好,我是IT修真院深圳分院第十一期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務十的一個知識點:如何使用分散式配置中心? 1    背景介紹 1.1    SpringCloud簡介 springCloud是基於SpringB

PM課堂需求分析的幾個來源

大家好,我是IT修真院深圳分院第14期的學員,今天給大家分享一下,需求分析的幾個來源。 一、背景介紹 需求是現實狀況與想象狀況的差距,差距越大,需求越大。 需求的本質是人的慾望。 舉個例子。吃飯,這是一項最基本的生理慾望,不吃就餓屎了。那吃飯,你就得先把飯做出來

JAVA課堂什麼叫明文,什麼叫密文,為什麼不允許在資料庫裡明文儲存密碼

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務五的一個知識點:什麼叫明文,什麼叫密文,為什麼不允許在資料庫裡明文儲存密碼? 1.背景介紹 2.知識剖析 3.常見問題 4.解決方案

JAVA課堂List集合

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務十的一個知識點:List集合 深入學習網址:http://www.jnshu.com/login/1/12744596 願不再有程式渣,我們只生產程式碼,而不

JAVA課堂Memcache和Redis的區別是什麼?

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務六的一個知識點:Memcache和Redis的區別是什麼? 課題:Memcache和Redis的區別是什麼? 1.背景介紹   &nb

JAVA課堂nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務三的一個知識點: nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理? 課題:nginx伺服器有什麼作用?什麼叫反向代理?為什麼要使用反向代理?

JAVA課堂Spring AOP

大家好,我是IT修真院深圳分院第十二期學員,一枚正直純潔善良的JAVA程式設計師。 今天給大家分享一下,修真院官網JAVA任務三的一個知識點:spring AOP 課題:spring AOP 1.背景介紹 2.知識剖析 3.常見問題 4.解決方案 5.編碼實戰 6