国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

node.js|vue.js|jquery|angularjs|React|json|js教程|

服務(wù)器之家 - 編程語言 - JavaScript - 對(duì)JavaScript中this指針的新理解分享

對(duì)JavaScript中this指針的新理解分享

2021-08-02 15:57junjie JavaScript

這篇文章主要介紹了對(duì)JavaScript中this指針的新理解分享,本文講解了方法調(diào)用模式、函數(shù)調(diào)用模式、構(gòu)造函數(shù)調(diào)用模式、Apply調(diào)用模式中的this指針理解,需要的朋友可以參考下

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

下面我們一起來看看這個(gè)this吧。

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

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

方法調(diào)用模式

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

 

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

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

 

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

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

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

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

 

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

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

 

    people.student();
</script>

 

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

是的只要在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",此時(shí)的self指向的是people對(duì)象
            };
            sayName();
        }
    }

 

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

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

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

 

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

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

 

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

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

 

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

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

 

這樣看就明白清楚了吧,new不僅會(huì)生成一個(gè)對(duì)象,而且還會(huì)自動(dòng)return這個(gè)對(duì)象,這樣自然this便指向了這個(gè)新對(duì)象。

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

Apply調(diào)用模式

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

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

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

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

<script type="text/javascript">
    function People(name){
        this.name = name;
        this.sayName = function(){
            console.log(this.name);   //sayName這個(gè)方法是屬于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實(shí)例時(shí),都會(huì)調(diào)用People構(gòu)造函數(shù)
    }
    var student = new Student("Yika");
    student.sayName(); //輸出“Yika”
</script>

 

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

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

若有錯(cuò)誤,請(qǐng)及時(shí)反映,我會(huì)盡快糾正,以防誤導(dǎo)他人,謝謝!

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲 欧美 日韩 在线 | 天天看夜夜爽 | 麻豆二区| 日韩成人精品 | 黄色三级网站 | 久久成人综合网 | 伊人伊成久久人综合网站 | 久久久久久国产精品mv | 欧美一区二区在线 | 久草成人| 国产中文字幕亚洲 | 亚洲激情在线 | 中文在线一区二区 | 精品国产乱码久久久久久久 | 天天澡天天狠天天天做 | 亚洲欧美精品 | 国产在线观看二区 | 日韩高清中文字幕 | 亚洲 欧美 国产 制服 动漫 | 亚洲精品天堂 | 中文字幕在线观看一区二区三区 | 日韩在线播放一区二区三区 | 久一久久| 欧美视频免费 | 国产成人自拍视频在线观看 | 精品国产凹凸成av人导航 | 中文字幕日产乱码六区小草 | 欧美日韩成人在线观看 | 免费一级在线观看 | 免费黄色在线看 | 国产黄色网址在线观看 | 99久久精品一区二区成人 | 欧美日韩久久久 | 精品国产黄a∨片高清在线 欧美一级免费 | 国产精品久久久久久久久久久久冷 | 婷婷天堂| 4438x成人网最大色成网站 | 综合色九九 | 国产精品久久久久久久一区探花 | 久久亚洲国产精品 | 北条麻妃99精品青青久久 |