色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>java源碼下載>

JAVA中關于this和that的一些知識

大小:0.3 MB 人氣:0 2017-09-25 需要積分:1

  新手在入門 Java 的過程中,一定會踩很多關于 this 的坑,出現問題的本質就是 this 指針的指向和自己想的不一樣。筆者在入門學習的過程中,也踩了很多坑,于是便寫下本篇文章記錄自己“踩坑”歷程。

  一。 this 在哪里?

  在上篇《從 Java 作用域說開去》分析中,我們知道,在 Execution Context 中有一個屬性是 this,這里的 this 就是我們所說的 this 。this 與上下文中可執行代碼的類型有直接關系,this 的值在進入執行上下文時確定,并且在執行上下文運行期間永久不變。

  this 到底取何值?this 的取值是動態的,是在函數真正被調用執行的時候確定的,函數定義的時候確定不了。因為 this 的取值是執行上下文環境的一部分,每次調用函數,都會產生一個新的執行上下文環境。

  所以 this 的作用就是用來指明執行上下文是在哪個上下文中被觸發的對象。令人迷惑的地方就在這里,同一個函數,當在不同的上下文進行調用的時候,this 的值就可能會不同。也就是說,this 的值就是函數調用表達式(也就是函數被調用的方式)的 caller。

  二。 this & that 具體指的是誰?

  目前接觸的有以下14種情況,筆者打算一一列舉出來,以后如果遇到了更多的情況,還會繼續增加。

  既然 this 是執行上下文確定的,那么從執行上下文的種類進行分類,可以分為3種:

  

  那么接下來我們就從 Global Execution Context 全局執行上下文,Function Execution Context 函數執行上下文,Eval Execution Context Eval執行上下文 這三類,具體談談 this 究竟指的是誰。

  (一)。 全局執行上下文1. 非嚴格模式下的函數調用

  這是函數的最通常用法,屬于全局性調用,因此 this 就代表全局對象 Global。

  var name = ‘halfrost’;function test() { console.log(this); // window console.log(this.name); // halfrost}test();

  在全局上下文(Global Context)中,this 總是 global object,在瀏覽器中就是 window 對象。

  2. 嚴格模式下的函數調用

  嚴格模式由 ECMA 5.1引進,用來限制 Java 的一些異常處理,提供更好的安全性和更強壯的錯誤檢查機制。使用嚴格模式,只需要將 ‘use strict’ 置于函數體的頂部。這樣就可以將上下文環境中的 this 轉為 undefined。這樣執行上下文環境不再是全局對象,與非嚴格模式剛好相反。

  在嚴格模式下,情況并不是僅僅是 undefined 這么簡單,有可能嚴格模式夾雜著非嚴格模式。

  先看嚴格模式的情況:

  ‘use strict’;function test() { console.log(this); //undefined};test();

  上面的這個情況比較好理解,還有一種情況也是嚴格模式下的:

  function execute() { ‘use strict’; // 開啟嚴格模式 function test() { // 內部函數也是嚴格模式 console.log(this); // undefined } // 在嚴格模式下調用 test() // this 在 test() 下是 undefined test(); // undefined } execute();

  如果嚴格模式在外層,那么在執行作用域內部聲明的函數,它會繼承嚴格模式。

  接下來就看看嚴格模式和非嚴格模式混合的情況。

  function nonStrict() { // 非嚴格模式 console.log(this); // window } function strict() { ‘use strict’; // 嚴格模式 console.log(this); // undefined }

  這種情況就比較簡單了,各個模式下分別判斷就可以了。

  (二)。函數執行上下文3. 函數調用

  當通過正常的方式調用一個函數的時候,this 的值就會被設置為 global object(瀏覽器中的 window 對象)。

  嚴格模式和非嚴格模式的情況和上述全局執行上下文的情況一致,嚴格模式對應的 undefined ,非嚴格模式對應的 window 這里就不再贅述了。

  4. 方法作為對象的屬性被調用

  var person = { name: “halfrost”, func: function () { console.log(this + “:” + this.name); }};person.func(); // halfrost

  在這個例子里面的 this 調用的是函數的調用者 person,所以會輸出 person.name 。

  當然如果函數的調用者是一個全局對象的話,那么這里的 this 指向又會發生變化。

  var name = “YDZ”;var person = { name: “halfrost”, func: function () { console.log(this + “:” + this.name); }};temp = person.func;temp(); // YDZ

  在上面這個例子里面,由于函數被賦值到了另一個變量中,并沒有作為 person 的一個屬性被調用,那么 this 的值就是 window。

  上述現象其實可以描述為,“從一個類中提取方式時丟失了 this 對象”。針對這個現象可以再舉一個例子:

  var counter = { count: 0, inc: function() { this.count ++; }}var func = counter.inc;func();counter.count; // 輸出0,會發現func函數根本不起作用

  這里我們雖然把 counter.inc 函數提取出來了,但是函數里面的 this 變成了全局對象了,所以 func() 函數執行的結果是 window.count++。然而 window.count 根本不存在,且值是 undefined,對 undefined 操作,得到的結果只能是 NaN。

非常好我支持^.^

(5) 83.3%

不好我反對

(1) 16.7%

用戶評論

      ?
      主站蜘蛛池模板: 欧美麻豆一精品一AV一免费 | 国产亚洲精品福利视频 | vr亚洲成年网址在线观看 | 99久久蜜臀亚洲AV无码精品 | 亚洲三级在线中文字幕 | 色婷婷亚洲五月 | 99热在线视频这里只精品 | 久久这里只有是精品23 | 首页_亚洲AV色老汉影院 | 美国ZOOM动物在线观看 | free俄罗斯性xxxxhd派对 | 无码AV熟妇素人内射V在线 | 一区一区三区产品 | 四虎国产精品免费观看视频 | 帝王受PLAY龙椅高肉NP | 免费亚洲视频 | 蜜桃成熟时2在线观看完整版hd | 性美国人xxxxx18 | 亚洲精品AV无码重口另类 | 天堂视频在线观看免费完整版 | 亚洲人成网站7777视频 | 国产精品日韩欧美一区二区三区 | 国产二区自拍 | 超碰国产人人做人人爽 | 激情内射亚洲一区二区三区爱妻 | 无码乱人伦一区二区亚洲一 | 亚洲国产在线精品国偷产拍 | 中文有码中文字幕免费视频 | 亚洲色大成网站www久久九九 | 777黄色片| 国产人妻人伦精品熟女麻豆 | 99精品视频 | 午夜久久影院 | ankha成人| 后入内射国产一区二区 | 亚洲中文久久精品AV无码 | 囯产免费精品一品二区三区视频 | 忘忧草秋观看未满十八 | 日韩国产精品欧美一区二区 | 视频一区视频二区ae86 | 拔擦拔擦8X永久华人免费播放器 |