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

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 13:16:02
字體:
來源:轉載
供稿:網友

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

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

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

在面向對象變成中,this十分重要,它的值取決于調用的模式。而在JavaScript中,一共有4中調用模式:方法調用模式、函數調用模式、構造函數調用模式、apply調用模式。

方法調用模式

當一個函數是作為一個對象的屬性時,我們通常稱這個函數是這個對象的一個方法。當這個方法被調用時,this就會指向該方法所屬對象。

復制代碼 代碼如下:

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

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

函數調用模式

當一個函數被調用時并非某個對象上的方法,那么它就是作為一個函數被調用的。

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

復制代碼 代碼如下:

<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函數本身和它所在的people對象都有name值,但是this是指向window的
            };
            sayName();
        }
    }

    people.student();
</script>

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

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

復制代碼 代碼如下:

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();
        }
    }

構造函數調用模式

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

我們先來看看構造函數一般長什么樣子。

復制代碼 代碼如下:

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

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

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

復制代碼 代碼如下:

<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,模仿調用new操作符
    Yika.sayName(); //和剛才一樣輸出"Yika"
</script>

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

千萬記得要用 new 去調用構造函數,不然出了問題,是沒有警告的,所有大寫約定還是十分有必要的。

Apply調用模式

apply方法讓我們構建一個參數數組傳遞給調用函數,也允許我們改變this值。

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

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

復制代碼 代碼如下:

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

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

好了,總算講完改變this的四種調用模式了,方法調用模式和構造函數調用模式會用的更多,也會更重要一點,而函數調用模式,我們則要學會避開其中的陷阱。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕日韩欧美| 最近2019好看的中文字幕免费| 国精产品一区一区三区有限在线| 亚洲一品av免费观看| 45www国产精品网站| 狠狠躁夜夜躁人人爽超碰91| 国产999精品视频| 国产精品久久久久久久app| 秋霞午夜一区二区| 久久国产精品视频| 精品magnet| 欧美超级乱淫片喷水| 日韩视频在线一区| 国产精品视频一| 91精品久久久久久久久不口人| 国产精品一区二区性色av| 日本欧美精品在线| 68精品久久久久久欧美| 国产精品美女www| 国产精品成人观看视频国产奇米| 国产精品日日摸夜夜添夜夜av| 久久露脸国产精品| 日韩精品视频在线观看免费| 亚洲欧洲一区二区三区在线观看| 欧洲美女免费图片一区| 欧美综合国产精品久久丁香| 欧美怡红院视频一区二区三区| 最近2019好看的中文字幕免费| 国产精品99导航| 精品女同一区二区三区在线播放| 亚洲乱码国产乱码精品精天堂| 欧美激情在线观看视频| 日韩国产精品视频| 亚洲成人精品视频在线观看| 九九精品视频在线| 91精品久久久久久久久久久久久久| 欧美性极品xxxx娇小| 奇米影视亚洲狠狠色| 亚洲精选中文字幕| 国产美女扒开尿口久久久| 国产精品视频在线观看| 久久久国产精品一区| 2018中文字幕一区二区三区| 色偷偷av一区二区三区乱| 久久久久久12| 欧美猛男性生活免费| 亚洲男人天堂视频| 午夜精品一区二区三区视频免费看| 亚洲自拍偷拍色片视频| 日本久久久a级免费| 欧美夜福利tv在线| 精品日韩美女的视频高清| 亚洲精品福利免费在线观看| 日本久久久久久久| 少妇高潮久久77777| 亚洲电影av在线| 日韩高清av一区二区三区| 亚洲成av人片在线观看香蕉| 日韩av影院在线观看| 少妇高潮久久久久久潘金莲| 欧美性猛交xxxx免费看| 久久精品国产v日韩v亚洲| 国产精品福利在线观看网址| 欧美在线视频在线播放完整版免费观看| 96sao精品视频在线观看| 亚洲欧美日韩精品| 欧美超级免费视 在线| 亚洲国产私拍精品国模在线观看| 欧美壮男野外gaytube| 欧美精品在线免费| 亚洲欧美国产精品久久久久久久| 国产成人精品久久亚洲高清不卡| 成人福利在线视频| 97热在线精品视频在线观看| 久久影视三级福利片| 亚洲欧美日本另类| 欧美成人在线免费视频| 日韩亚洲欧美中文高清在线| 亚洲成人黄色在线观看| 亚洲男子天堂网| 91在线中文字幕| 欧美激情xxxx| 最近2019年日本中文免费字幕| 亚洲欧美另类国产| 国产精品揄拍一区二区| 亚洲成人在线视频播放| 欧美精品制服第一页| 韩国国内大量揄拍精品视频| 国产精品免费视频xxxx| 欧美疯狂性受xxxxx另类| 精品久久久久久久久久久久久久| 18一19gay欧美视频网站| 成人网址在线观看| 国产aⅴ夜夜欢一区二区三区| 欧洲日韩成人av| 日本电影亚洲天堂| 欧美精品videosex牲欧美| 亚洲国产精品久久久久秋霞蜜臀| 成人免费在线网址| 久久国产精品偷| 亚洲午夜av久久乱码| 搡老女人一区二区三区视频tv| 欧美做受高潮电影o| 欧洲亚洲在线视频| 欧美日韩综合视频网址| 亚洲区中文字幕| 欧美视频在线观看免费网址| 亚洲图片欧美午夜| 久久香蕉国产线看观看av| 欧美激情亚洲精品| 久久精品国亚洲| 欧美激情亚洲激情| 亚洲а∨天堂久久精品9966| 亚洲人成亚洲人成在线观看| 国产精品一区二区三区久久久| 国产欧美最新羞羞视频在线观看| 国产伦精品一区二区三区精品视频| 欧美一级淫片videoshd| 亚洲成色777777女色窝| 91最新国产视频| 在线不卡国产精品| 国产91亚洲精品| 国产精品日韩精品| 欧美性高跟鞋xxxxhd| 欧美老女人bb| 欧美性20hd另类| 国产美女精品视频免费观看| 日韩中文视频免费在线观看| 日韩免费精品视频| 亚洲第一区第二区| 一区二区三区视频免费在线观看| 国内精品视频一区| 国产亚洲视频中文字幕视频| 亚洲国产欧美一区二区丝袜黑人| 亚洲人成网7777777国产| 欧美亚州一区二区三区| 国产69久久精品成人看| 欧美日本国产在线| 欧美激情视频一区二区三区不卡| 成人97在线观看视频| 国产亚洲精品综合一区91| 性夜试看影院91社区| 精品人伦一区二区三区蜜桃免费| 亚洲aaaaaa| 中文在线资源观看视频网站免费不卡| 欧美精品videos另类日本| 亚洲人成网站999久久久综合| 欧美性xxxxx极品娇小| 色综合91久久精品中文字幕| 亚洲精品美女在线观看| 91精品久久久久久久久不口人| 91美女片黄在线观| 欧美成人高清视频| 日韩午夜在线视频| 97成人在线视频| 国产精品福利在线观看网址| 欧美另类69精品久久久久9999| 日韩精品免费在线观看| 久久亚洲影音av资源网| 亚洲激情在线视频| 夜夜躁日日躁狠狠久久88av| 国产日产久久高清欧美一区| 51精品在线观看| 欧美在线亚洲在线|