成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Javascript This 機(jī)制

DTeam / 1412人閱讀

摘要:中除了聲明定義的形參之外,每個(gè)函數(shù)還可以接收兩個(gè)附加參數(shù)。這里我們就來(lái)仔細(xì)學(xué)習(xí)一下吧。加油,多看幾遍,影像會(huì)更深的呢

js中除了聲明定義的形參之外,每個(gè)函數(shù)還可以接收兩個(gè)附加參數(shù)(this、arguments)。這里我們就來(lái)仔細(xì)學(xué)習(xí)一下this吧。

在javascript中明確this指向大致有四種情況

函數(shù)調(diào)用的模式,this指向window
function aa()
{
    console.log(this);
}
aa(); // window
方法調(diào)用模式, this指向方法所在的對(duì)象
var a = {};
a.name = "zjj";
a.getName = function(){
    console.log(this.name);
}
a.getName();   // "zjj",這里this指向的是調(diào)用的那個(gè)對(duì)象
構(gòu)造函數(shù)模式, this指向新生成的實(shí)例
function aaa(name){
    this.name = name;
    this.getName = function(){
        console.log(this.name);   // 這里的this指向?qū)嵗膶?duì)象
    }
}

var a = new aaa("meils");
a.getName(); // "meils"

var b = new aaa("bobo");
b.getName()        //  "bobo"
apply/call調(diào)用模式
var list1 = {name: "zjj"};
var list2 = {name: "lll"};

function a(){
    console.log(this.name);
}

a.call(list1);  // "zjj"
a.call(list2);  // "lll"

先來(lái)一個(gè)面試題吧

obj = {

    name: "a",

    getName : function () {

        console.log(this.name);console.log(this);

    }

}


var fn = obj.getName

obj.getName() // 這里this指向的是調(diào)用getName的那個(gè)對(duì)象

var fn2 = obj.getName() // 同上執(zhí)行一次 ,返回的fn2已經(jīng)不是一個(gè)函數(shù)了

fn()        // 這里的this指向的是window,由于window下并沒(méi)有name變量,所以沒(méi)有輸出

fn2()        // 由于fn2不是一個(gè)函數(shù),因此會(huì)報(bào)錯(cuò)
// 輸出如下

a
{name: "a", getName: ?}
a
{name: "a", getName: ?}getName: ? ()name: "a"__proto__: Object

Window?{postMessage: ?, blur: ?, focus: ?, close: ?, frames: Window,?…}
Uncaught TypeError: fn2 is not a function
下面我們依舊通過(guò)例子來(lái)學(xué)習(xí)this哦

實(shí)例一

function demo1(){
    console.log(this)  
}
function demo2(){
    this.num=2
    function demo3(){
          this.num++
          console.log(num)
    }
    return demo3; 
}


demo1(); // this指向window
var a = demo2(); // 
a(); // 3  a變量將demo2函數(shù)執(zhí)行后的的返回值及demo3函數(shù)返回, 然后執(zhí)行,此時(shí)this依舊指向window
var obj1={
      value:3,
      increment:function(){
           this.value++;
           console.log(this,this.value)
      }
}
obj1.increment()

// {value: 4, increment: ?}  4

實(shí)例二

var obj2={
      value:4,
      increment:function(){
           this.value++;
           console.log(this,this.value);
           (function(){
                 console.log("這又是啥",this,this.value)
                 this.value=1
           })() 
      },
      print:function(){
            console.log("print",this.value)
      }
}
obj2.increment() // this是obj2
obj2.print()
var P=obj2.print
P() // this是window

// 
{value: 5, increment: ?, print: ?} 5
這又是啥 Window  undefined
print 5
print 1
obj2.increment() this是obj2,執(zhí)行了value++,此時(shí)的value為5,而后是一個(gè)自我執(zhí)行的函數(shù),這里的this是window,由于window下的value還沒(méi)有申明,因此返回的是undefined。之后執(zhí)行obj2.print()這里的this是obj2,輸出value是5,而后變量P執(zhí)行了obj2的print方法,這里的this指向了window,所以輸出的是1
ES6的箭頭函數(shù)

現(xiàn)在我們都經(jīng)常會(huì)用的es6的箭頭函數(shù),箭頭函數(shù)是不會(huì)自動(dòng)綁定this的,默認(rèn)從上一級(jí)繼承下來(lái),那不妨把剛才的例子改下看看

var obj1={
      value:3,
      increment:()=>{
           this.value++;
           console.log(this,this.value)
      }
}
obj1.increment() // 這時(shí)候會(huì)看到輸出window對(duì)象和一個(gè)NaN
如前面所說(shuō)箭頭函數(shù)不會(huì)自動(dòng)綁定this,所以執(zhí)行increment函數(shù)中的this依舊會(huì)指向window,而window下的value還不存在,所以為undefined再執(zhí)行+1操作所以value就變成了NaN了
var obj2={
      value:4,
      increment:()=>{
           this.value++;
           console.log(this,this.value);
           (function(){
                 console.log("這又是啥",this,this.value)
                 this.value=1
           })() 
      },
      print:()=>{
            console.log("print",this.value)
      }
}
obj2.increment() 
obj2.print()
var P=obj2.print
P()
// 打印結(jié)果出如下
// Window 
//  NaN
// 這又是啥 Window
// NaN
// print 1
// print 1
第一個(gè)依舊window對(duì)象(this沒(méi)綁定的嘛),后面的value當(dāng)然又是沒(méi)聲明.....然后自執(zhí)行函數(shù)也沒(méi)得說(shuō),后面才接著給window的value賦值為1了,后面就兩句自然輸出兩次1了

相信看了上面的例子,大家一定對(duì)this的使用有了一定的了解了吧。加油,多看幾遍,影像會(huì)更深的呢

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94088.html

相關(guān)文章

  • JavaScript 五十問(wèn)——從源碼分析 ES6 Class 的實(shí)現(xiàn)機(jī)制

    摘要:防止類的構(gòu)造函數(shù)以普通函數(shù)的方式調(diào)用。這個(gè)函數(shù)的主要作用是通過(guò)給類添加方法,其中將靜態(tài)方法添加到構(gòu)造函數(shù)上,將非靜態(tài)的方法添加到構(gòu)造函數(shù)的原型對(duì)象上。 Class是ES6中新加入的繼承機(jī)制,實(shí)際是Javascript關(guān)于原型繼承機(jī)制的語(yǔ)法糖,本質(zhì)上是對(duì)原型繼承的封裝。本文將會(huì)討論:1、ES6 class的實(shí)現(xiàn)細(xì)2、相關(guān)Object API盤點(diǎn)3、Javascript中的繼承實(shí)現(xiàn)方案盤點(diǎn)...

    LeexMuller 評(píng)論0 收藏0
  • 理解JavaScript的核心知識(shí)點(diǎn):This

    摘要:關(guān)鍵字計(jì)算為當(dāng)前執(zhí)行上下文的屬性的值。毫無(wú)疑問(wèn)它將指向了這個(gè)前置的對(duì)象。構(gòu)造函數(shù)也是同理。嚴(yán)格模式無(wú)論調(diào)用位置,只取顯式給定的上下文綁定的,通過(guò)方法傳入的第一參數(shù),否則是。其實(shí)并不屬于特殊規(guī)則,是由于各種事件監(jiān)聽(tīng)定義方式本身造成的。 this 是 JavaScript 中非常重要且使用最廣的一個(gè)關(guān)鍵字,它的值指向了一個(gè)對(duì)象的引用。這個(gè)引用的結(jié)果非常容易引起開(kāi)發(fā)者的誤判,所以必須對(duì)這個(gè)關(guān)...

    TerryCai 評(píng)論0 收藏0
  • 寫給Java開(kāi)發(fā)者看的JavaScript對(duì)象機(jī)制

    摘要:如果你已經(jīng)對(duì)機(jī)制已有了解,但是由于兩者對(duì)象機(jī)制的巨大本質(zhì)差異,對(duì)它和構(gòu)造函數(shù),實(shí)例對(duì)象的關(guān)系仍有疑惑,本文或許可以解答你的問(wèn)題。所有的原型對(duì)象都會(huì)自動(dòng)獲得一個(gè)屬性,這個(gè)屬性的值是指向原型所在的構(gòu)造函數(shù)的指針。 幫助面向?qū)ο箝_(kāi)發(fā)者理解關(guān)于JavaScript對(duì)象機(jī)制 本文是以一個(gè)熟悉OO語(yǔ)言的開(kāi)發(fā)者視角,來(lái)解釋JavaScript中的對(duì)象。 對(duì)于不了解JavaScript 語(yǔ)言,尤其是習(xí)...

    Charles 評(píng)論0 收藏0
  • 細(xì)說(shuō) Javascript 函數(shù)篇(二) : this 的工作機(jī)制

    摘要:與其他編程語(yǔ)言相比,對(duì)的使用是一套完全不同的機(jī)制。在五種情況下的值是各有不同的。調(diào)用一個(gè)函數(shù)時(shí)在這里,同樣指向全局對(duì)象。此時(shí)在函數(shù)內(nèi),指向新建的對(duì)象。盡管,晚綁定初看上去是個(gè)不好的決定,但實(shí)際上這是原型式繼承工作的基礎(chǔ)。 與其他編程語(yǔ)言相比,Javascript 對(duì) this 的使用是一套完全不同的機(jī)制。this 在五種情況下的值是各有不同的。 全局作用域下 this; 當(dāng)在全...

    ZoomQuiet 評(píng)論0 收藏0
  • 這一次,我們換種姿勢(shì)學(xué)習(xí) javascript

    摘要:操作符或調(diào)用函數(shù)時(shí)傳入?yún)?shù)的操作都會(huì)導(dǎo)致關(guān)聯(lián)作用域的賦值操作。此外可以使用和來(lái)設(shè)置對(duì)象及其屬性的不可變性級(jí)別。忽視這一點(diǎn)會(huì)導(dǎo)致許多問(wèn)題。使用調(diào)用函數(shù)時(shí)會(huì)把新對(duì)象的屬性關(guān)聯(lián)到其他對(duì)象。 前言 《你不知道的 javascript》是一個(gè)前端學(xué)習(xí)必讀的系列,讓不求甚解的JavaScript開(kāi)發(fā)者迎難而上,深入語(yǔ)言內(nèi)部,弄清楚JavaScript每一個(gè)零部件的用途。本書(shū)介紹了該系列的兩個(gè)主題:...

    zone 評(píng)論0 收藏0
  • Javascript函數(shù)執(zhí)行、new機(jī)制以及繼承

    摘要:函數(shù)執(zhí)行一個(gè)函數(shù),被執(zhí)行有三種途徑或機(jī)制以及繼承中定義了一種對(duì)象,稱之為對(duì)象,其內(nèi)部實(shí)現(xiàn)包括以下說(shuō)明該對(duì)象可以被執(zhí)行,具有屬性說(shuō)明該對(duì)象可以接受操作,具有構(gòu)造器屬性指向?qū)ο蟮脑玩湣? JS函數(shù)執(zhí)行 一個(gè)JavaScript函數(shù)fn,被執(zhí)行有三種途徑: fn() new fn() fn.call()或fn.apply() new機(jī)制以及繼承 JavaScript中定義了一種對(duì)象,稱之...

    sshe 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<