欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

對JavaScript中this指針的新理解分享

 更新時間:2015年01月31日 14:58:04   投稿:junjie  
這篇文章主要介紹了對JavaScript中this指針的新理解分享,本文講解了方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造函數(shù)調(diào)用模式、Apply調(diào)用模式中的this指針理解,需要的朋友可以參考下

一直以來對this的理解只在可以用,會用,卻沒有去深究其本質(zhì)。這次,借著《JavaScript The Good Parts》,作了一次深刻的理解。(所有調(diào)試都可以在控制臺中看到,瀏覽器F12鍵)

下面我們一起來看看這個this吧。

在我們聲明一個函數(shù)時,每個函數(shù)除了有定義時的parameters(形參),自身還會有額外的兩個參數(shù),一個是this,一個是arguments(實參)。arguments就是函數(shù)實際接受到的參數(shù),是一個類數(shù)組。arguments我只做個簡略的介紹,重點我們放在this指針上。

在面向?qū)ο笞兂芍?,this十分重要,它的值取決于調(diào)用的模式。而在JavaScript中,一共有4中調(diào)用模式:方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造函數(shù)調(diào)用模式、apply調(diào)用模式。

方法調(diào)用模式

當(dāng)一個函數(shù)是作為一個對象的屬性時,我們通常稱這個函數(shù)是這個對象的一個方法。當(dāng)這個方法被調(diào)用時,this就會指向該方法所屬對象。

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

<script type="text/javascript">
    var people = {
        name : "Yika",
        sayName : function(){
            console.log(this.name);   //"Yika"
                        //this已經(jīng)綁定在了people對象上了
        }
    }
    people.sayName();
</script>

如栗子所示,this指向了sayName對象,這種通過this取得所屬對象上下文的方法,就是公共方法。(publice method)

函數(shù)調(diào)用模式

當(dāng)一個函數(shù)被調(diào)用時并非某個對象上的方法,那么它就是作為一個函數(shù)被調(diào)用的。

這種模式調(diào)用,this會指向window對象,即使這個函數(shù)或許是在外部函數(shù)里調(diào)用的,我們來看栗子。

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

<script type="text/javascript">
    var name = "window-Yika";
    var people = {
        name : "people-Yika",
        student : function(){
            console.log(this);   //這里的this綁定的是對象people
            function sayName(){
                var name = "sayName-Yika";
                console.log(this.name); //window-Yika
          //即使sayName函數(shù)本身和它所在的people對象都有name值,但是this是指向window的
            };
            sayName();
        }
    }

    people.student();
</script>

這樣一看,是不是大概知道該怎么解決JavaScript這個“設(shè)計錯誤"了呢。

是的只要在student函數(shù)里面,也就是第6行,將this緩存起來。然后再將this通過變量轉(zhuǎn)移到sayName函數(shù)里就可以解決啦!

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

var people = {
        name : "people-Yika",
        student : function(){
            var self = this; //將this緩存起來
            function sayName(){
                var name = "sayName-Yika";
                console.log(self.name);  //"people-Yika",此時的self指向的是people對象
            };
            sayName();
        }
    }

構(gòu)造函數(shù)調(diào)用模式

  JavaScript里一講到構(gòu)造函數(shù),腦海里就會有:“函數(shù)名大寫!調(diào)用的時候要用new操作符!” 函數(shù)名大寫好理解,是為了規(guī)范統(tǒng)一構(gòu)造函數(shù)的命名。可是你有沒有深究過為什么要用new呢?如果在一個函數(shù)前面帶上new來調(diào)用,那么函數(shù)后臺會創(chuàng)建一個指向該函數(shù)prototype的新對象,同時this也綁定在新對象上。JavaScript是一門基于原型繼承的語言,對原型prototype不是很清楚的同學(xué)可以自己去查一下資料,我重點放在this上面。

我們先來看看構(gòu)造函數(shù)一般長什么樣子。

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

<script type="text/javascript">
    function People(name){
        this.name = name;    //這里的this,用new調(diào)用后便指向了新對象Yika    
     this.sayName = function(){
          console.log(this.name);  //輸出
      }
    }
  var Yika = new People("Yika"); 
   Yika.sayName();  //輸出“Yika" ,因為Yika是通過new調(diào)用得來的,this都綁定在了Yika對象上。
</script>

乍一看,好像不是好懂,怎么剛才在函數(shù)里的this是指向window,現(xiàn)在不用緩存就可以指向People函數(shù)呢?

沒關(guān)系,剛才不是說函數(shù)通過new調(diào)用,會在背地里自己做“做壞事”么,我們一起看看到底做了哪些事。

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

<script type="text/javascript">
    function People(name){
        var that = {};   //壞事一:自己生成一個對象
        that.name = name;
        that.sayName = function(){
            console.log(that.name);
        };
        return that;    //壞事二,自己會改變return的行為,return剛生成的對象
    }
    var Yika = People("Yika"); //這里可以省略new,模仿調(diào)用new操作符
    Yika.sayName(); //和剛才一樣輸出"Yika"
</script>

這樣看就明白清楚了吧,new不僅會生成一個對象,而且還會自動return這個對象,這樣自然this便指向了這個新對象。

千萬記得要用 new 去調(diào)用構(gòu)造函數(shù),不然出了問題,是沒有警告的,所有大寫約定還是十分有必要的。

Apply調(diào)用模式

apply方法讓我們構(gòu)建一個參數(shù)數(shù)組傳遞給調(diào)用函數(shù),也允許我們改變this值。

function.apply(this綁定的值, arguments參數(shù)數(shù)組)

apply可以說的東西太多了,我這里只舉個的栗子來幫助大家理解:

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

<script type="text/javascript">
    function People(name){
        this.name = name;
        this.sayName = function(){
            console.log(this.name);   //sayName這個方法是屬于People構(gòu)造函數(shù)的
        }
    }
    function Student(name){
        People.apply(this, arguments);//借用構(gòu)造函數(shù)的集成方式,就是在Student構(gòu)造函數(shù)里,通過apply調(diào)用People構(gòu)造函數(shù),并改變People的this值
                                      //這樣每次創(chuàng)建Student實例時,都會調(diào)用People構(gòu)造函數(shù)
    }
    var student = new Student("Yika");
    student.sayName(); //輸出“Yika”
</script>

我們可以通過apply輕易的修改函數(shù)的this綁定對象,和apply相似的方法call也有一樣的效果,有興趣的同學(xué)可以自己搜索學(xué)習(xí)一下。

好了,總算講完改變this的四種調(diào)用模式了,方法調(diào)用模式和構(gòu)造函數(shù)調(diào)用模式會用的更多,也會更重要一點,而函數(shù)調(diào)用模式,我們則要學(xué)會避開其中的陷阱。

若有錯誤,請及時反映,我會盡快糾正,以防誤導(dǎo)他人,謝謝!

相關(guān)文章

  • 理解javascript中DOM事件

    理解javascript中DOM事件

    這篇文章主要幫助大家理解javascript中DOM事件,解決了DOM事件的兼容性,DOM事件的冒泡,以及DOM事件的重用,感興趣的小伙伴們可以參考一下
    2015-12-12
  • JavaScript調(diào)用客戶端Java程序的方法

    JavaScript調(diào)用客戶端Java程序的方法

    這篇文章主要介紹了JavaScript調(diào)用客戶端Java程序的方法,實例分析了javascript調(diào)用java程序的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 一篇文章帶你淺入webpack的DLL優(yōu)化打包

    一篇文章帶你淺入webpack的DLL優(yōu)化打包

    這篇文章主要介紹了一篇文章帶你淺入webpack的DLL優(yōu)化打包,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • js定義類的幾種方法(推薦)

    js定義類的幾種方法(推薦)

    下面小編就為大家?guī)硪黄猨s定義類的幾種方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • 小程序點餐界面添加購物車左右擺動動畫

    小程序點餐界面添加購物車左右擺動動畫

    這篇文章主要介紹了小程序點餐界面添加購物車左右擺動動畫,當(dāng)用戶點擊添加到購物車后會有一個左右擺動的購物車提示效果,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2020-09-09
  • javascript實現(xiàn)評分功能

    javascript實現(xiàn)評分功能

    這篇文章主要為大家詳細(xì)介紹了javascript實現(xiàn)評分功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • js獲取json中key所對應(yīng)的value值的簡單方法

    js獲取json中key所對應(yīng)的value值的簡單方法

    下面小編就為大家?guī)硪黄猨s獲取json中key所對應(yīng)的value值的簡單方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • JS控制阿拉伯?dāng)?shù)字轉(zhuǎn)為中文大寫示例代碼

    JS控制阿拉伯?dāng)?shù)字轉(zhuǎn)為中文大寫示例代碼

    阿拉伯?dāng)?shù)字如何轉(zhuǎn)為中文大寫這個實現(xiàn)的方法有很多,在本文將為大家介紹下js中時如何實現(xiàn)的,感興趣的朋友可以參考下
    2013-09-09
  • 淺談javascript中for in 和 for each in的區(qū)別

    淺談javascript中for in 和 for each in的區(qū)別

    兩個的作用都用來遍歷對象,但為什么有了for in語句了還要for each in語句呢,后來看了下for each in開發(fā)的文檔,for each in是作為E4X標(biāo)準(zhǔn)的一部分在javascript 1.6中發(fā)布的,而且它不是ECMAScript標(biāo)準(zhǔn)的一部分
    2015-04-04
  • 屏蔽相應(yīng)鍵盤按鈕操作

    屏蔽相應(yīng)鍵盤按鈕操作

    本篇文章主要是對屏蔽相應(yīng)鍵盤按鈕的操作代碼進(jìn)行了介紹,需要的朋友可以過來參考下,希望對大家有所幫助
    2014-03-03

最新評論