亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Javascript淺談之引用類型

 更新時(shí)間:2013年12月18日 14:44:55   作者:  
這篇文章主要介紹了Javascript引用類型,有需要的朋友可以參考一下

簡(jiǎn)介
1.引用類型(Reference type)
引用類型是javascript中一種內(nèi)部類型。它主要是當(dāng)做一個(gè)指代,代替一個(gè)變量或者函數(shù),當(dāng)然在需要真實(shí)值時(shí),又可以通過(guò)它尋找到真實(shí)值。

2.引用類型的結(jié)構(gòu)
引用類型的值時(shí)由兩部分構(gòu)成,一是引用類型的值指代的對(duì)象的所屬對(duì)象,這里我們姑且把它叫做base,二是base中的指代對(duì)象的對(duì)象名稱。用偽代碼來(lái)表示:

復(fù)制代碼 代碼如下:

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

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

(1)在處理一個(gè)標(biāo)示符時(shí)

標(biāo)示符是變量名,函數(shù)名,函數(shù)參數(shù)名和全局對(duì)象中未識(shí)別的屬性名。

(2)在處理一個(gè)屬性訪問(wèn)器時(shí)

復(fù)制代碼 代碼如下:

var foo = 10;
function bar( ){}

在操作的中間結(jié)果中,引用類型對(duì)應(yīng)

復(fù)制代碼 代碼如下:

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

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

這里還是有必要解釋一下base,在javascript中所有對(duì)象或者函數(shù)都有所屬對(duì)象,看過(guò)我前面文章的人都知道,在每個(gè)執(zhí)行上下文有個(gè)變量對(duì)象專門來(lái)管理這個(gè)執(zhí)行上下文中的變量或者函數(shù)。

所以,當(dāng)處理標(biāo)示符時(shí):

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

在函數(shù)的執(zhí)行上下文中,base === VO/AO

但處理對(duì)象屬性是:

這個(gè)更是簡(jiǎn)單,base === owerObject

4.獲取引用類型的真正值
一開(kāi)始我們說(shuō)了,引用類型只是一個(gè)指代,而不是它并不保存真正的值。當(dāng)需要真正的值時(shí),可以通過(guò)內(nèi)部一系列算法,可以得到。這個(gè)算法,我們可以用簡(jiǎn)單的偽代碼來(lái)描述:

復(fù)制代碼 代碼如下:

function GetValue(value) {

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

  var base = GetBase(value);

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

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

}

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

復(fù)制代碼 代碼如下:

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

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

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

引用類型與this的關(guān)系
引用類型主要是跟函數(shù)上下文中的this指向關(guān)系密切,且不同時(shí)候看起來(lái)還差異挺大,所有我們才引出引用類型來(lái)專門解釋函數(shù)上下文中this的表現(xiàn)。

函數(shù)上下文中確定this值的通用規(guī)則如下:

在一個(gè)函數(shù)上下文中,this由調(diào)用者提供,由調(diào)用函數(shù)的方式來(lái)決定。如果調(diào)用括號(hào)()的左邊是引用類型的值,this將設(shè)為引用類型值的base對(duì)象(base object),在其他情況下(與引用類型不同的任何其它屬性),這個(gè)值為null。不過(guò),實(shí)際不存在this的值為null的情況,因?yàn)楫?dāng)this的值為null的時(shí)候,其值會(huì)被隱式轉(zhuǎn)換為全局對(duì)象。注:第5版的ECMAScript中,已經(jīng)不強(qiáng)迫轉(zhuǎn)換成全局變量了,而是賦值為undefined。

下面我們根據(jù)調(diào)用括號(hào)左邊不同分三種情況進(jìn)行討論:

(1)調(diào)用括號(hào)左邊是引用類型的值

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

復(fù)制代碼 代碼如下:

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

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

(2)調(diào)用括號(hào)左邊是引用類型的值,不過(guò)這個(gè)值為null

復(fù)制代碼 代碼如下:

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

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

當(dāng)一個(gè)內(nèi)部函數(shù)被調(diào)用時(shí),這個(gè)內(nèi)部函數(shù)的base應(yīng)該是當(dāng)前執(zhí)行上下文中活動(dòng)對(duì)象(OA),但是在javascript內(nèi)部在OA作為base時(shí),都當(dāng)做null處理,javascript當(dāng)然不允許this為null的情況發(fā)生,所有就將base設(shè)置為global對(duì)象(這是前文this函數(shù)調(diào)用模式中設(shè)計(jì)錯(cuò)誤的源頭)。所以在這情況下,this都指向全局對(duì)象。

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

復(fù)制代碼 代碼如下:

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

//復(fù)雜些的例子
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

當(dāng)調(diào)用括號(hào)的左邊不是引用類型而是其它類型,this自動(dòng)設(shè)置為null,結(jié)果為全局對(duì)象。

第一個(gè)例子中,立即函數(shù),它的函數(shù)調(diào)用小括號(hào)左邊是一個(gè)表達(dá)式,不是一個(gè)引用。

第二個(gè)例子復(fù)雜了許多,我們來(lái)一個(gè)個(gè)分析:

foo.bar(),這個(gè)沒(méi)有疑問(wèn),base為foo,this指向foo。

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

后面三個(gè),小括號(hào)里面依次是賦值運(yùn)算、或運(yùn)算和逗號(hào)運(yùn)算,它們都會(huì)迫使引用類型執(zhí)行GetValue方法,從而返回一個(gè)函數(shù)對(duì)象。這樣,函數(shù)調(diào)用小括號(hào)左邊就不再是引用類型了,所有,this都是指向全局對(duì)象的。

總結(jié)

關(guān)于引用類型,其實(shí)我都一直不太了解這個(gè),只是看到湯姆大叔的博客中this那章,為了解釋函數(shù)調(diào)用模式中this的取值原理且專門分析了一下,這一分析可不得了,我之前一直認(rèn)為引用類型和引用傳值應(yīng)該存在某些關(guān)系,沒(méi)想到,它大叔bolg中只是用來(lái)輔助理解this。至于他們二者之前有沒(méi)有關(guān)系,如果有關(guān)系到底是一種什么關(guān)系,這還得我繼續(xù)學(xué)習(xí)研究。

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

  • JavaScript中setMonth()方法的使用詳解

    JavaScript中setMonth()方法的使用詳解

    這篇文章主要介紹了JavaScript中setMonth()方法的使用詳解,是JS入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-06-06
  • TypeScript基礎(chǔ)class類教程示例

    TypeScript基礎(chǔ)class類教程示例

    這篇文章主要為大家介紹了TypeScript基礎(chǔ)class類教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-02-02
  • 基于JavaScript實(shí)現(xiàn)繼承機(jī)制之調(diào)用call()與apply()的方法詳解

    基于JavaScript實(shí)現(xiàn)繼承機(jī)制之調(diào)用call()與apply()的方法詳解

    本文將介紹兩種很類似于對(duì)象冒充的繼承方式,即使用call()和apply()方法
    2013-05-05
  • ECMAScript 5嚴(yán)格模式(Strict Mode)介紹

    ECMAScript 5嚴(yán)格模式(Strict Mode)介紹

    這篇文章主要介紹了ECMAScript 5嚴(yán)格模式(Strict Mode)介紹,本文講解了如何啟用嚴(yán)格模式、啟用嚴(yán)格模式后對(duì)變量和屬性、函數(shù)、with語(yǔ)句的影響,需要的朋友可以參考下
    2015-03-03
  • 深入理解JS正則表達(dá)式---分組

    深入理解JS正則表達(dá)式---分組

    下面小編就為大家?guī)?lái)一篇深入理解JS正則表達(dá)式---分組。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • 怎樣在JavaScript里寫(xiě)一個(gè)swing把數(shù)據(jù)插入數(shù)據(jù)庫(kù)

    怎樣在JavaScript里寫(xiě)一個(gè)swing把數(shù)據(jù)插入數(shù)據(jù)庫(kù)

    在JavaScript里寫(xiě)一個(gè)swing來(lái)實(shí)現(xiàn)確定取消,來(lái)決定是否執(zhí)行這個(gè)功能 控制把數(shù)據(jù)插入數(shù)據(jù)庫(kù),接下來(lái)介紹實(shí)現(xiàn)方法
    2012-12-12
  • TypeScript中的接口和泛型你了解嗎

    TypeScript中的接口和泛型你了解嗎

    這篇文章主要為大家詳細(xì)介紹了TypeScript接口和泛型,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-03-03
  • javascript之Array 數(shù)組對(duì)象詳解

    javascript之Array 數(shù)組對(duì)象詳解

    本文主要是對(duì)javascript之Array 數(shù)組對(duì)象的詳解 ,比較詳細(xì),希望能給大家做一個(gè)參考。
    2016-06-06
  • 詳解Eslint 配置及規(guī)則說(shuō)明

    詳解Eslint 配置及規(guī)則說(shuō)明

    這篇文章主要介紹了詳解Eslint 配置及規(guī)則說(shuō)明,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 最新評(píng)論