摘要:情況如果一個(gè)函數(shù)中有,這個(gè)函數(shù)有被上一級(jí)的對(duì)象所調(diào)用,那么指向的就是上一級(jí)的對(duì)象。
首先必須要說(shuō)的是,this的指向在函數(shù)定義的時(shí)候是確定不了的,只有函數(shù)執(zhí)行的時(shí)候才能確定this到底指向誰(shuí),實(shí)際上this的指向的是最終調(diào)用它的對(duì)象。
函數(shù)調(diào)用模式例子1
function a(){ var user = "username"; console.log(this.user); //undefined console.log(this); //Window } a();
按照我們上面說(shuō)的this最終指向的是調(diào)用它的對(duì)象,這里的函數(shù)a實(shí)際是被Window對(duì)象所點(diǎn)出來(lái)的,下面的代碼就可以證明。
function a(){ var user = "username"; console.log(this.user); //undefined console.log(this); //Window } window.a();
例子2
var o = { user:"username", fn:function(){ console.log(this.user); //username } } o.fn();
這里的this指向的是對(duì)象o,因?yàn)槟阏{(diào)用這個(gè)fn是通過(guò)o.fn()執(zhí)行的,那自然指向就是對(duì)象o,這里再次強(qiáng)調(diào)一點(diǎn),this的指向在函數(shù)創(chuàng)建的時(shí)候是決定不了的,在調(diào)用的時(shí)候才能決定,誰(shuí)調(diào)用的就指向誰(shuí),一定要搞清楚這個(gè)。
例子3
var o = { user:"username", fn:function(){ console.log(this.user); //username } } window.o.fn();
這段代碼和上面的那段代碼幾乎是一樣的,但是這里的this為什么不是指向window,如果按照上面的理論,最終this指向的是調(diào)用它的對(duì)象。這里先不解釋為什么上面的那段代碼this沒有指向window,我們?cè)賮?lái)看一段代碼。
var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //12 } } } o.b.fn();
這里同樣也是對(duì)象o點(diǎn)出來(lái)的,但是同樣this并沒有執(zhí)行它,那你肯定會(huì)說(shuō)我一開始說(shuō)的那些不就都是錯(cuò)誤的嗎?其實(shí)也不是,只是一開始說(shuō)的不準(zhǔn)確,接下來(lái)我將補(bǔ)充一句話,我相信你就可以徹底的理解this的指向的問(wèn)題。
情況1:如果一個(gè)函數(shù)中有this,但是它沒有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是window。
情況2:如果一個(gè)函數(shù)中有this,這個(gè)函數(shù)有被上一級(jí)的對(duì)象所調(diào)用,那么this指向的就是上一級(jí)的對(duì)象。
情況3:如果一個(gè)函數(shù)中有this,這個(gè)函數(shù)中包含多個(gè)對(duì)象,盡管這個(gè)函數(shù)是被最外層的對(duì)象所調(diào)用,this指向的也只是它上一級(jí)的對(duì)象,例子3可以證明,如果不相信,那么接下來(lái)我們繼續(xù)看幾個(gè)例子。
var o = { a:10, b:{ // a:12, fn:function(){ console.log(this.a); //undefined } } } o.b.fn();
盡管對(duì)象b中沒有屬性a,這個(gè)this指向的也是對(duì)象b,因?yàn)閠his只會(huì)指向它的上一級(jí)對(duì)象,不管這個(gè)對(duì)象中有沒有this要的東西。
例子4
var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //undefined console.log(this); //window } } } var j = o.b.fn; j();
這里this指向的是window,是不是有些蒙了?其實(shí)是因?yàn)槟銢]有理解一句話,這句話同樣至關(guān)重要。
this永遠(yuǎn)指向的是最后調(diào)用它的對(duì)象,也就是看它執(zhí)行的時(shí)候是誰(shuí)調(diào)用的,例子4中雖然函數(shù)fn是被對(duì)象b所引用,但是在將fn賦值給變量j的時(shí)候并沒有執(zhí)行所以最終指向的是window,這和例子3是不一樣的,例子3是直接執(zhí)行了fn。
構(gòu)造器調(diào)用模式function Fn(){ this.user = "username"; } var a = new Fn(); console.log(a.user); //username
這里之所以對(duì)象a可以點(diǎn)出函數(shù)Fn里面的user是因?yàn)閚ew關(guān)鍵字,使用new關(guān)鍵字發(fā)生了什么事?
1) 函數(shù)在執(zhí)行前,會(huì)創(chuàng)建一個(gè)空對(duì)象
2) 把this指向這個(gè)新創(chuàng)建的空對(duì)象
3) 執(zhí)行函數(shù)里面的所有語(yǔ)句
4) 執(zhí)行完畢最后一條語(yǔ)句之后,會(huì)把創(chuàng)建的這個(gè)對(duì)象返回。
return
● 如果構(gòu)造函數(shù)顯式地return了一個(gè)基本類型,那么return語(yǔ)句會(huì)被無(wú)視。return的仍然是原先的對(duì)象。
● 如果return一個(gè)引用類型值,那么return的東西就是函數(shù)返回的東西,我們創(chuàng)建的新對(duì)象不會(huì)被返回。
function fn() { this.user = "username"; return {}; } var a = new fn; console.log(a.user); //undefined
function fn() { this.user = "username"; return 1; } var a = new fn; console.log(a.user); //username
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/87404.html
摘要:其中和在傳入要綁定的指向時(shí),立即執(zhí)行。需要注意的是,當(dāng)使用改變函數(shù)內(nèi)部的指向時(shí)如果傳入的不是一個(gè)對(duì)象,會(huì)調(diào)用相對(duì)的構(gòu)造函數(shù),進(jìn)行隱式類型裝換。 關(guān)于javascript中this指向的總結(jié) 瀏覽器環(huán)境 在全局作用域中,this的指向是window對(duì)象 console.log(this); //Window對(duì)象 console.log(this === window); //true E...
摘要:不過(guò),匿名函數(shù)的執(zhí)行環(huán)境具有全局性,因此其對(duì)象通常指向。示例如下依然指向全局全局方法指向匿名函數(shù)目前為止,一切都符合預(yù)期表現(xiàn)。指向指向全局調(diào)用對(duì)象方法調(diào)用方法內(nèi)部方法雖然有點(diǎn)繞,但是還是可以明白的,指向調(diào)用方法該對(duì)象,匿名函數(shù)指向全局。 前言 以下內(nèi)容只針對(duì)非嚴(yán)格模式,嚴(yán)格模式區(qū)不說(shuō)了如果看過(guò)《JavaScript高級(jí)程序設(shè)計(jì)(第3版)》的人都應(yīng)該有印象,里面關(guān)于this對(duì)象是這么形容...
總結(jié)call,apply,bind方法的理解使用和區(qū)別。 call,apply,bind這三個(gè)方法在JavaScript中是用來(lái)改變函數(shù)調(diào)用的this指向。那么改變函數(shù)this指向有什么用呢?我們先來(lái)看一段代碼 var a= { name:harden, fn:function () { console.log(this.name); } } var b =...
摘要:當(dāng)碰到時(shí)呵呵再看一個(gè)呵呵再來(lái)呵呵呵呵呵呵呵呵什么意思呢如果返回值是一個(gè)對(duì)象,那么指向的是構(gòu)造函數(shù)的實(shí)例但是并沒有被返回,如果返回值不是一個(gè)對(duì)象那么還是指向構(gòu)造函數(shù)創(chuàng)建的實(shí)例。 為什么要學(xué)習(xí)this?如果你學(xué)過(guò)面向?qū)ο缶幊?,那你肯定知道干什么用的,如果你沒有學(xué)過(guò),那么暫時(shí)可以不用看這篇文章,當(dāng)然如果你有興趣也可以看看,畢竟這是js中必須要掌握的東西。 1. this指向調(diào)用他的對(duì)象 首先...
摘要:第二種情況是箭頭函數(shù)的如果指向普通函數(shù)它的繼承于該普通函數(shù)。箭頭函數(shù)的指向全局,使用會(huì)報(bào)未聲明的錯(cuò)誤。 showImg(https://segmentfault.com/img/remote/1460000018610072?w=600&h=400); 箭頭函數(shù)是ES6的API,相信很多人都知道,因?yàn)槠湔Z(yǔ)法上相對(duì)于普通函數(shù)更簡(jiǎn)潔,深受大家的喜愛。就是這種我們?nèi)粘i_發(fā)中一直在使用的API...
摘要:常用場(chǎng)景以函數(shù)形式調(diào)用指向指向了以方法形式調(diào)用指向調(diào)用方法的那個(gè)對(duì)象指向顏色為紅色構(gòu)造函數(shù)調(diào)用指向?qū)嵗膶?duì)象此處分別指向的實(shí)例對(duì)象控制臺(tái)輸出使用對(duì)象的方法時(shí)指向報(bào)錯(cuò)因?yàn)槭堑囊粋€(gè)方法更改錯(cuò)誤使顏色為調(diào)用了這個(gè)方法此時(shí)的指向此操作將指向的賦給則 THIS常用場(chǎng)景 1、以函數(shù)形式調(diào)用,this指向window function fn(m,n){ m=2; n=3; console...
閱讀 3729·2023-04-25 23:32
閱讀 2103·2019-08-30 15:55
閱讀 2709·2019-08-30 15:52
閱讀 3173·2019-08-30 10:54
閱讀 900·2019-08-29 16:16
閱讀 711·2019-08-29 15:09
閱讀 3715·2019-08-26 14:05
閱讀 1692·2019-08-26 13:22