国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JS中this的使用指南

lscho / 3462人閱讀

摘要:那么對(duì)于有返回值構(gòu)造函數(shù),如何指定呢而從上面,我們可以看出的是這種情況下,不再返回對(duì)象,而是返回語(yǔ)句的返回值。

首先來(lái)看兩個(gè)例子

var user="lilei"
function fn(){
    console.log(user);
    console.log(this.user);
}
fn();
console.log(this.user);

輸出結(jié)果

lilei
lilei
lilei

這個(gè)很好解釋,user定義的是全局變量,fn調(diào)用的時(shí)候,相當(dāng)于是window.fn(),而this就是指向調(diào)用它的對(duì)象,也就是window,所以第二個(gè)console輸入的是lilei.而在最外層,this.user這里面的this其實(shí)是指向window的,所以也就相當(dāng)于window.user,輸出lilei。

node中輸出

lilei
undefined
undefined

再看個(gè)例子

function fn(){
    var user="lilei"
    console.log(user);
    console.log(this.user);
}
fn();
console.log(this.user);

輸出結(jié)果

lilei
undefined
undefined

這里面牽涉到局部變量和全局變量相同時(shí),局部變量會(huì)覆蓋全局變量。所以第一個(gè)自然是lilei。此時(shí)函數(shù)內(nèi)部的this調(diào)用指向window,而在全局變量中并未定義user,所以報(bào)undefined。而第三個(gè)和第二個(gè)是一樣的。

有一點(diǎn)需要明確的是,this在創(chuàng)建函數(shù)的內(nèi)部是不知道到底指向誰(shuí),只有在調(diào)用的時(shí)候,方能決定!
var user="lihua"
function fn(){
    console.log(user);
    var user="lilei";
    console.log(this.user);
    this.user=123;
}
fn();
console.log(this.user);

輸出結(jié)果

undefined
lihua
123

第一個(gè)之所以打印undefined,是因?yàn)榇a處理分兩個(gè)階段,第一階段是變量,函數(shù)聲明,以及正常格式的參數(shù)創(chuàng)建,這是一個(gè)解析和進(jìn)入上下文的階段。第二個(gè)階段是代碼執(zhí)行,函數(shù)表達(dá)式和不合格的標(biāo)識(shí)符(為聲明的變量)被創(chuàng)建。所以fn就相當(dāng)于

function fn(){
    var user;
    console.log(user);
    user="lilei";
    console.log(this.user);
    this.user=123;
}

打印undefined是自然而然的事情。第二個(gè)打印lihua,沒(méi)什么解釋的。第三個(gè)是因?yàn)樾薷牧藅his.user,所以會(huì)打印123。

也就是說(shuō),this指向的是最后調(diào)用他的對(duì)象。不過(guò)可以通過(guò)call,apply,bind來(lái)改變this的指向。

那么對(duì)于構(gòu)造函數(shù)是如何指向的呢?

function Fn(){
    this.user = "lilei";
}
var a = new Fn();
console.log(a.user); //lilei

我們發(fā)現(xiàn)這個(gè)this指向a,之所以指向a是因?yàn)閚ew操作符,改變了this的指向。
那么對(duì)于有返回值構(gòu)造函數(shù),this如何指定呢?

function Fn(){
    this.user = "lilei";
    return 1;
}
var a = new Fn();
console.log(a.user); //lilei

function Fn(){
    this.user = "lilei";
    return {user:"lihua"};
}
var a = new Fn();
console.log(a.user); //lihua

從上面,我們可以看出

return的是Object 這種情況下,不再返回this對(duì)象,而是返回return語(yǔ)句的返回值。a.user的時(shí)候那么調(diào)用的{user:lihua}的值。

這種情況我們可以這樣理解

function Fn(){
    this.user = "lilei";
    return 1;
}
var a = new Fn();
等價(jià)于
function Fn(){}
var a = new Object();
a.__proto__ = Fn.prototype;
Fn.call(a)

function Fn(){
    this.user = "lilei";
    return {user:"lihua"};
}
var a = new Fn();

等價(jià)于

function Fn(){}
var a = new Object();
a.__proto__ =  {user:"lihua"}.prototype;
{user:"lihua"}.call(a)
如果return的是五種簡(jiǎn)單數(shù)據(jù)類型:String,Number,Boolean,Null,Undefined。這種情況下,忽視r(shí)eturn值,依然返回this對(duì)象。

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

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

相關(guān)文章

  • should.js源碼分析與學(xué)習(xí)

    摘要:結(jié)構(gòu)其中為整個(gè)項(xiàng)目入口,為中的類,負(fù)責(zé)對(duì)測(cè)試信息進(jìn)行記錄。通過(guò)拋出錯(cuò)誤而不是返回布爾值的方式來(lái)通知用戶,能夠更加明顯的通知用戶,也方便向上拋出異常進(jìn)行傳遞。 背景 為了研究與學(xué)習(xí)某些測(cè)試框架的工作原理,同時(shí)也為了完成培訓(xùn)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的測(cè)試框架的原因,我對(duì)should.js的代碼進(jìn)行了學(xué)習(xí)與分析,現(xiàn)在與大家來(lái)進(jìn)行交流下。 目錄 ext assertion.js assertion-e...

    Turbo 評(píng)論0 收藏0
  • 使用 Vue.js 和 Chart.js 制作絢麗多彩圖表

    摘要:但是大多數(shù)開箱即用的解決方案用默認(rèn)的選項(xiàng)并不能做出很絢麗的圖表。這篇文章中,我會(huì)教你如何自定義選項(xiàng)來(lái)制作很酷的圖表。我們使用來(lái)作為的打包器。代碼中,使用了一些實(shí)例數(shù)據(jù)和可選參數(shù)傳遞給的數(shù)據(jù)對(duì)象,并且設(shè)置,使得圖表會(huì)充滿外層容器。 showImg(https://segmentfault.com/img/remote/1460000009049816?w=1000&h=424); 本文...

    劉厚水 評(píng)論0 收藏0
  • 一步一步開發(fā)安卓下react-native應(yīng)用系列之進(jìn)階篇

    摘要:首先我們打開命令行,切換到項(xiàng)目根目錄下,輸入安裝完成后,請(qǐng)注意,需要把目錄下的所有字體文件拷貝到目錄下,如果沒(méi)有該目錄,請(qǐng)自行創(chuàng)建。 ????????看過(guò)我前面文章的朋友們現(xiàn)在應(yīng)該能正常運(yùn)行自己的第一個(gè)RN應(yīng)用了,那都是小兒科,現(xiàn)在我們來(lái)做點(diǎn)進(jìn)階一點(diǎn)的東西。這篇文章有一些屬于干貨性的東西,請(qǐng)仔細(xì)閱讀。特別需要注意我加粗的部分。????????首先我們來(lái)看下js文件結(jié)構(gòu),在項(xiàng)目初始化成功...

    xioqua 評(píng)論0 收藏0
  • 用100行代碼,完成自己前端構(gòu)建工具!

    摘要:行代碼,你將擁有一個(gè)現(xiàn)代化規(guī)范測(cè)試驅(qū)動(dòng)高延展性的前端構(gòu)建工具。在閱讀前,給大家一個(gè)小懸念什么是鏈?zhǔn)讲僮髦虚g件機(jī)制如何讀取構(gòu)建文件樹如何實(shí)現(xiàn)批量模板渲染代碼轉(zhuǎn)譯如何實(shí)現(xiàn)中間件間數(shù)據(jù)共享。函數(shù)將參數(shù)中的掛載到上,并返回以便于鏈?zhǔn)讲僮骷纯伞? ES2017+,你不再需要糾結(jié)于復(fù)雜的構(gòu)建工具技術(shù)選型。 也不再需要gulp,grunt,yeoman,metalsmith,fis3。 以上的這些構(gòu)建...

    haitiancoder 評(píng)論0 收藏0
  • js call apply ,試在vue使用

    摘要:先引用一句基本都會(huì)引用的句子,但本次并不是介紹兩個(gè)方法的區(qū)別,而是嘗試在中進(jìn)行使用。二應(yīng)用在中在實(shí)例中的中定義了一個(gè)變量,在中打印出來(lái)同時(shí)調(diào)用中的方法。測(cè)試在中直接使用實(shí)踐證明也是可以打印出來(lái)的。 注意:該方法的語(yǔ)法和作用與 apply() 方法類似,只有一個(gè)區(qū)別,就是 call() 方法接受的是一個(gè)參數(shù)列表,而 apply() 方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。 先引用一句基本都會(huì)...

    why_rookie 評(píng)論0 收藏0
  • 深入 Parcel--架構(gòu)與流程篇

    摘要:本篇文章是對(duì)的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你了解打包工具的內(nèi)部原理,在這之前你如果對(duì)不熟悉可以先到官網(wǎng)了解介紹下面是偷懶從官網(wǎng)抄下來(lái)的介紹極速零配置應(yīng)用打包工具極速打包使用進(jìn)程去啟用多核編譯。 showImg(https://segmentfault.com/img/bVbpZRp?w=1241&h=893); 本篇文章是對(duì) Parce 的源碼解析,代碼基本架構(gòu)與執(zhí)行流程,帶你...

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

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

0條評(píng)論

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