成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

JavaScript 之 this 指向問題

Alan / 407人閱讀

摘要:一等公民對象函數(shù)在提指向問題之前,肯定是有必要說明一等公民對象,既然是對象,那么就能像普通的值一樣傳遞。在普通瀏覽器中指向的是在中指向的是全局對象全局環(huán)境中或者模塊環(huán)境中。即指向或者的第一個(gè)參數(shù)。第二條規(guī)則,指向的不是原文鏈接

1. 一等公民對象——函數(shù)

在提t(yī)his指向問題之前,肯定是有必要說明一等公民對象function ,既然function是對象,那么就能像普通的值一樣傳遞。嗯,在匿名函數(shù)中,這樣的做法是非常常見的。

函數(shù)會(huì)在代碼的運(yùn)行前進(jìn)行解析,這就保證了函數(shù)存在于當(dāng)前上下文的任意一個(gè)地方,即在函數(shù)定義的前面去調(diào)用也是正確的。

foo();

function foo () {};

函數(shù)是一個(gè)對象,所以我們常常會(huì)看見把一個(gè)匿名的函數(shù)給一個(gè)值。

var foo = function () {};

賦值語句只有在執(zhí)行的時(shí)候才會(huì)運(yùn)行,也就是說所看到的var foo = 1 是分為兩部分的:

var foo;
...
foo = 1;
...

所以可能會(huì)出現(xiàn)下面的問題

foo;     //undefined
foo();   //TypeError
var foo = function () {
  console.log(1);
}

因?yàn)樗拖旅娴膶懛ㄊ且粯拥?/p>

var foo;

foo;

foo();

foo = function () {
  console.log(1);
}

正常的,我們這樣寫是沒有問題的

foo;   // undefined 

var foo = function () {
  console.log(1);
}

foo(); // 1
2. this指向問題

javascript中的this和一般語言中的this是有點(diǎn)區(qū)別的,在不同的情況下,指向也有所不同:

1.全局范圍內(nèi)

指向的是全局對象。在普通瀏覽器中指向的是window, 在Node中指向的是全局對象global(全局環(huán)境中) 或者module.exports(模塊環(huán)境中)。

2.函數(shù)調(diào)用中

在普通的函數(shù)調(diào)用中,this依舊指向全局對象。(這個(gè)設(shè)計(jì)似乎并沒有什么作用,應(yīng)該是一個(gè)錯(cuò)誤的設(shè)計(jì)。并且在很多的情況下不注意都會(huì)引來很多的麻煩)

Foo.method = function () {
  function test () {
      //這里的this指向的不是Foo.而是全局對象
  }        
}

一般我們會(huì)創(chuàng)建一個(gè)局部的變量去指代上一層的對象

Foo.method = function () {
  that = this;   //按照下面一條規(guī)則,這兒的this指向的是Foo
  function (test) {
    // that
  }
}

3.方法調(diào)用中

指向調(diào)用它的對象

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

指向新創(chuàng)建的對象

5.顯式設(shè)置this

指向顯式指向的對象。即指向call或者apply的第一個(gè)參數(shù)。

注意:

像下面這樣對方法進(jìn)行賦值的時(shí)候,函數(shù)內(nèi)this的指向也不是賦值時(shí)所調(diào)用方法的對象。

var test = Obj.method();

test(); // 第二條規(guī)則,this指向的不是Obj

原文鏈接:http://life.rccoder.net/javascript/1210.html

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

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/78373.html

相關(guān)文章

  • javascript技術(shù)難點(diǎn)(三)this、new、apply和call詳解

    摘要:第四點(diǎn)也要著重講下,記住構(gòu)造函數(shù)被操作,要讓正常作用最好不能在構(gòu)造函數(shù)里 4) this、new、call和apply的相關(guān)問題 講解this指針的原理是個(gè)很復(fù)雜的問題,如果我們從javascript里this的實(shí)現(xiàn)機(jī)制來說明this,很多朋友可能會(huì)越來越糊涂,因此本篇打算換一個(gè)思路從應(yīng)用的角度來講解this指針,從這個(gè)角度理解this指針更加有現(xiàn)實(shí)意義。 下面我們看看在ja...

    ghnor 評論0 收藏0
  • JavaScript深入bind的模擬實(shí)現(xiàn)

    摘要:也就是說當(dāng)返回的函數(shù)作為構(gòu)造函數(shù)的時(shí)候,時(shí)指定的值會(huì)失效,但傳入的參數(shù)依然生效。構(gòu)造函數(shù)效果的優(yōu)化實(shí)現(xiàn)但是在這個(gè)寫法中,我們直接將,我們直接修改的時(shí)候,也會(huì)直接修改函數(shù)的。 JavaScript深入系列第十一篇,通過bind函數(shù)的模擬實(shí)現(xiàn),帶大家真正了解bind的特性 bind 一句話介紹 bind: bind() 方法會(huì)創(chuàng)建一個(gè)新函數(shù)。當(dāng)這個(gè)新函數(shù)被調(diào)用時(shí),bind() 的第一個(gè)參數(shù)...

    FingerLiu 評論0 收藏0
  • 學(xué)習(xí)JavaScriptthis,call,apply

    摘要:在全局對象中調(diào)用,自然讀取的是全局對象的值構(gòu)造器調(diào)用說明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門花了一天,來弄懂JavaScript的this,call,apply。中途參考的書籍也很多,以...

    wenhai.he 評論0 收藏0
  • 深入理解 Javascript this

    摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個(gè)函數(shù),但是執(zhí)行結(jié)果可能不一樣。該變量由運(yùn)行環(huán)境提供。所以,就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。 深入淺出this的理解 問題的由來 var obj = { foo: function(){} } var foo = obj.foo; // 寫法一 obj.foo(); // 寫法二 foo...

    OnlyMyRailgun 評論0 收藏0
  • JavaScript陰溝里翻船運(yùn)算符優(yōu)先級

    摘要:操作符的兩種形態(tài)其實(shí)在的操作符描述中,語法是你會(huì)發(fā)現(xiàn)被中括號所包圍也就意味著可缺省,因此,如果對于不含參數(shù)的構(gòu)造函數(shù)而言與二者并無區(qū)別,那我們接著思考一個(gè)問題,對于前面返回函數(shù)的而言,當(dāng)?shù)臅r(shí)候?yàn)槭裁磮?zhí)行的是而不是呢。  首先歡迎大家關(guān)注我的Github博客,也算是對我的一點(diǎn)鼓勵(lì),畢竟寫東西沒法變現(xiàn),堅(jiān)持下去也是靠的是自己的熱情和大家的鼓勵(lì)。各位讀者的Star是激勵(lì)我前進(jìn)的動(dòng)力,請不要吝...

    selfimpr 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<