亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

Javascript淺談之引用類型

2019-11-20 21:26:17
字體:
來源:轉載
供稿:網友

簡介
1.引用類型(Reference type)
引用類型是javascript中一種內部類型。它主要是當做一個指代,代替一個變量或者函數,當然在需要真實值時,又可以通過它尋找到真實值。

2.引用類型的結構
引用類型的值時由兩部分構成,一是引用類型的值指代的對象的所屬對象,這里我們姑且把它叫做base,二是base中的指代對象的對象名稱。用偽代碼來表示:

復制代碼 代碼如下:

var valueOfReferenceType = {
base: <base object>,
propertyName: <property name>
};

3.使用情景
引用類型的使用情景有二:

(1)在處理一個標示符時

標示符是變量名,函數名,函數參數名和全局對象中未識別的屬性名。

(2)在處理一個屬性訪問器時

復制代碼 代碼如下:

var foo = 10;
function bar( ){}

在操作的中間結果中,引用類型對應

復制代碼 代碼如下:

var fooReference = {
        base: global,
        propertyName: 'foo'
    };

    var barReference = {
        base: global,
        propertyName: 'bar'
    };

這里還是有必要解釋一下base,在javascript中所有對象或者函數都有所屬對象,看過我前面文章的人都知道,在每個執行上下文有個變量對象專門來管理這個執行上下文中的變量或者函數。

所以,當處理標示符時:

在全局上下文中,毋庸置疑,base === globalVO === gloabal

在函數的執行上下文中,base === VO/AO

但處理對象屬性是:

這個更是簡單,base === owerObject

4.獲取引用類型的真正值
一開始我們說了,引用類型只是一個指代,而不是它并不保存真正的值。當需要真正的值時,可以通過內部一系列算法,可以得到。這個算法,我們可以用簡單的偽代碼來描述:

復制代碼 代碼如下:

function GetValue(value) {

  if (Type(value) != Reference) {
    return value;
  }

  var base = GetBase(value);

  if (base === null) {
    throw new ReferenceError;
  }

  return base.[[Get]](GetPropertyName(value));

}

內部的[[Get]]方法返回對象屬性真正的值,包括對原型鏈中繼承的屬性分析。所有通過GetValue我們也可以輕松獲取引用類型的真正的值。如下例:

復制代碼 代碼如下:

GetValue(fooReference); // 10
GetValue(barReference); // function object "bar"

那我們什么時候需要獲取引用類型的真正值呢?

一般是在引用類型需要進行賦值、參與運算或者被調用是需要通過GetValue方法獲取真正值。(注意:通過GetValue獲取到的對象不再是引用類型)

引用類型與this的關系
引用類型主要是跟函數上下文中的this指向關系密切,且不同時候看起來還差異挺大,所有我們才引出引用類型來專門解釋函數上下文中this的表現。

函數上下文中確定this值的通用規則如下:

在一個函數上下文中,this由調用者提供,由調用函數的方式來決定。如果調用括號()的左邊是引用類型的值,this將設為引用類型值的base對象(base object),在其他情況下(與引用類型不同的任何其它屬性),這個值為null。不過,實際不存在this的值為null的情況,因為當this的值為null的時候,其值會被隱式轉換為全局對象。注:第5版的ECMAScript中,已經不強迫轉換成全局變量了,而是賦值為undefined。

下面我們根據調用括號左邊不同分三種情況進行討論:

(1)調用括號左邊是引用類型的值

這無需作過多分析,base對象就是this值,找到base即可。如果是全局變量下申明的,那就指向全局對象。

復制代碼 代碼如下:

var myObject = {
     foo : function(){
            console.log(this);
      } 
}

myObject.foo(); //毫無疑問,這個foo的base是myObject,故foo方法中的this指向myObject。

(2)調用括號左邊是引用類型的值,不過這個值為null

復制代碼 代碼如下:

function myFunction() {
     var foo = function(){
            console.log(this);
      } 
       foo();    //AO.foo() => null.foo()
}

myFunction(); //輸出:Window {top: Window, window: Window...}

當一個內部函數被調用時,這個內部函數的base應該是當前執行上下文中活動對象(OA),但是在javascript內部在OA作為base時,都當做null處理,javascript當然不允許this為null的情況發生,所有就將base設置為global對象(這是前文this函數調用模式中設計錯誤的源頭)。所以在這情況下,this都指向全局對象。

(3)調用括號左邊不是引用類型的值

復制代碼 代碼如下:

//簡單點的例子
(function () {
  console.log(this); // null => global
})();

//復雜些的例子
var foo = {
  bar: function () {
    console.log(this);
  }
};

foo.bar(); // Reference, OK => foo
(foo.bar)(); // Reference, OK => foo

(foo.bar = foo.bar)(); // global
(false || foo.bar)(); // global
(foo.bar, foo.bar)(); // global

當調用括號的左邊不是引用類型而是其它類型,this自動設置為null,結果為全局對象。

第一個例子中,立即函數,它的函數調用小括號左邊是一個表達式,不是一個引用。

第二個例子復雜了許多,我們來一個個分析:

foo.bar(),這個沒有疑問,base為foo,this指向foo。

(foo.bar)(),這里用到了一個小括號,它在這起到分組符作用,也就是它不會迫使引用類型執行GetValue方法,其執行結果,跟上面一模一樣。

后面三個,小括號里面依次是賦值運算、或運算和逗號運算,它們都會迫使引用類型執行GetValue方法,從而返回一個函數對象。這樣,函數調用小括號左邊就不再是引用類型了,所有,this都是指向全局對象的。

總結

關于引用類型,其實我都一直不太了解這個,只是看到湯姆大叔的博客中this那章,為了解釋函數調用模式中this的取值原理且專門分析了一下,這一分析可不得了,我之前一直認為引用類型和引用傳值應該存在某些關系,沒想到,它大叔bolg中只是用來輔助理解this。至于他們二者之前有沒有關系,如果有關系到底是一種什么關系,這還得我繼續學習研究。

希望大家多交流。在此還是的感謝湯姆大叔.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产性色av一区二区| 成人欧美在线观看| 亚洲黄色片网站| 亚洲第一网站男人都懂| 亚洲午夜精品久久久久久久久久久久| 久久久久久噜噜噜久久久精品| 久久久久久久激情视频| 日韩中文字幕免费| 欧美孕妇孕交黑巨大网站| 日本一本a高清免费不卡| 热99精品里视频精品| 色悠久久久久综合先锋影音下载| 亚洲xxxx做受欧美| 精品爽片免费看久久| 91黑丝在线观看| 性亚洲最疯狂xxxx高清| 久久久久九九九九| 91色视频在线观看| 成人在线精品视频| 亚洲伊人久久综合| 最近2019年手机中文字幕| 久久久久久午夜| 亚洲第一福利网站| 91大神福利视频在线| 久久国产精品视频| 国产一区二区黑人欧美xxxx| 国产一区二区三区在线观看视频| 欧美日韩国产中字| 国产成人拍精品视频午夜网站| 青青久久aⅴ北条麻妃| 亚洲精品国产精品乱码不99按摩| 亚洲人免费视频| 国产精国产精品| 欧美激情女人20p| xvideos国产精品| 亚洲影院色在线观看免费| 精品视频一区在线视频| 久久久久久久久久久av| 97在线视频免费| 成人性教育视频在线观看| 97视频在线观看亚洲| 日韩一区二区av| 欧美一级电影在线| 国产精品96久久久久久| 69影院欧美专区视频| 都市激情亚洲色图| 国产精品成人观看视频国产奇米| 国模私拍一区二区三区| 91精品免费视频| 国产精品 欧美在线| 欧美成人亚洲成人| 国产精品jvid在线观看蜜臀| 欧美极品美女视频网站在线观看免费| 国产成人精品999| 国产精品爽爽爽爽爽爽在线观看| 亚洲人成77777在线观看网| 亚洲日韩第一页| 在线观看日韩欧美| 亚洲三级黄色在线观看| 成人欧美在线视频| 久久激情五月丁香伊人| 日韩麻豆第一页| 国产精品美乳一区二区免费| 深夜成人在线观看| 黑人精品xxx一区一二区| 亚洲黄页网在线观看| 成人黄色大片在线免费观看| 国产成人精品一区二区| 97视频在线观看亚洲| 久久成人精品一区二区三区| 亚洲成人a**站| 日本不卡高字幕在线2019| 久久久精品视频在线观看| 亚洲自拍偷拍网址| 国产在线精品成人一区二区三区| 亚洲网在线观看| 中文字幕在线国产精品| 欧美激情xxxx| 日韩精品在线视频美女| 亚洲国产天堂久久国产91| 午夜精品视频在线| 91在线观看免费高清完整版在线观看| 乱亲女秽乱长久久久| 国产精品自产拍在线观看中文| 亚洲国产欧美精品| 欧美老女人www| 亚洲日韩欧美视频一区| 日韩av综合网| 最新国产精品亚洲| 91网站免费观看| 成人免费xxxxx在线观看| 欧洲成人在线视频| 欧美孕妇孕交黑巨大网站| 亚洲激情第一页| 中文字幕亚洲第一| 欧美日韩国产丝袜美女| 国产成人精品在线视频| 亚洲国模精品私拍| 欧美激情亚洲国产| 韩国视频理论视频久久| 欧美电影免费观看高清完整| 国产精品678| 亚洲午夜久久久久久久| 亚洲最大的av网站| 91综合免费在线| 91精品国产综合久久男男| 97婷婷大伊香蕉精品视频| 亚洲人精品午夜在线观看| 成人做爽爽免费视频| 欧美亚洲第一页| 欧美激情一区二区三区高清视频| 国产精品久久久久久久app| 伊人久久久久久久久久久久久| 精品国产网站地址| 亚洲无亚洲人成网站77777| 91av在线免费观看视频| 国产97在线|日韩| 中文字幕日韩欧美精品在线观看| 亚洲性日韩精品一区二区| 日韩av影片在线观看| 激情av一区二区| 国产不卡精品视男人的天堂| 日韩最新在线视频| 欧美日韩免费看| 日本不卡高字幕在线2019| 国产一区二区三区在线观看视频| 亚洲视频精品在线| www日韩欧美| 欧美精品亚州精品| 日韩一区av在线| 欧美高跟鞋交xxxxhd| 日韩中文字幕视频在线| 96pao国产成视频永久免费| 欧美视频在线看| 欧美在线中文字幕| 亚洲欧美三级在线| 日韩av最新在线观看| 欧美成人精品一区二区| 亚洲欧美国产精品| 亚洲女人天堂视频| 91在线无精精品一区二区| 91在线免费观看网站| 久久综合国产精品台湾中文娱乐网| 91亚洲精品在线观看| 97成人在线视频| 日韩免费高清在线观看| 欧美激情一区二区三区在线视频观看| 国产噜噜噜噜久久久久久久久| 欧美另类老女人| 欧美日韩成人网| 55夜色66夜色国产精品视频| 欧美精品一区三区| 成人有码在线视频| 午夜精品蜜臀一区二区三区免费| 中文字幕日韩有码| 日韩av在线电影网| 国产精品久久久久久超碰| 亚洲国产精品女人久久久| 成人一区二区电影| 日韩精品免费观看| 成人av.网址在线网站| 欧美乱人伦中文字幕在线| 国产精品久久久久久中文字| 亚洲欧洲在线看|