摘要:一等公民對象函數(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(); // 12. 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
摘要:第四點(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...
摘要:也就是說當(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ù)...
摘要:在全局對象中調(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。中途參考的書籍也很多,以...
摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個(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...
摘要:操作符的兩種形態(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)力,請不要吝...
閱讀 3071·2021-11-23 09:51
閱讀 1052·2021-09-02 15:21
閱讀 3018·2019-08-30 13:56
閱讀 1841·2019-08-29 14:12
閱讀 717·2019-08-29 13:53
閱讀 1677·2019-08-29 11:32
閱讀 1340·2019-08-29 11:25
閱讀 1504·2019-08-28 17:51