摘要:可以意為這時(shí)又是一門運(yùn)行時(shí)的語(yǔ)言,所以我們來(lái)看看在不同的情況下的含義處于被對(duì)象調(diào)用的方法中處于普通函數(shù)中在構(gòu)造函數(shù)中的指向用簡(jiǎn)單的話來(lái)說(shuō)就是誰(shuí)調(diào)用,就指向誰(shuí)先看處于被對(duì)象調(diào)用的方法中二狗子很明顯,調(diào)用者是,按照上面的簡(jiǎn)單規(guī)則誰(shuí)調(diào)用就指向誰(shuí)所
this
this可以意為這時(shí),javascript又是一門運(yùn)行時(shí)的語(yǔ)言,所以我們來(lái)看看this在不同的情況下的含義
處于被對(duì)象調(diào)用的方法中
處于普通函數(shù)中
在構(gòu)造函數(shù)中
this的指向用簡(jiǎn)單的話來(lái)說(shuō)就是
誰(shuí)調(diào)用,就指向誰(shuí)
先看 處于被對(duì)象調(diào)用的方法中
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj // 很明顯,調(diào)用者是obj,按照上面的簡(jiǎn)單規(guī)則 “誰(shuí)調(diào)用就指向誰(shuí)” 所以這里的this == obj console.log("汪汪汪"); } }; obj.bark();
再來(lái) 處于普通函數(shù)中
var obj = { name: "二狗子", bark: function(){ console.log(this); ===> window // 不要以為bark在obj里面定義的,所以this就是obj,記住javascript是在運(yùn)行時(shí)才能確定的,但是這里等于window,也許會(huì)讓人有點(diǎn)意外,但是如果你知道了全局環(huán)境下所有的屬性方法都是于window就不會(huì)奇怪了,所以這里其實(shí)隱藏了一個(gè)window,所以其實(shí)是window.bark();這樣調(diào)用的,在參照 “誰(shuí)調(diào)用就指向誰(shuí)” 所以這里的this == window console.log("汪汪汪"); } }; // 注意前面沒(méi)有加obj bark();
接著 在構(gòu)造函數(shù)中
構(gòu)造函數(shù)其實(shí)跟普通函數(shù)沒(méi)有任何區(qū)別,在沒(méi)有使用new修飾符的時(shí)候,函數(shù)就是函數(shù),只有加了new后,函數(shù)才是一個(gè)構(gòu)造函數(shù),是new賦予了函數(shù)的特殊能力讓其進(jìn)化成了構(gòu)造函數(shù)
func1和func2都是普普通通的函數(shù) function func1(){} function func2(){} new func1(); // 嘭,一瞬間,func1有了新的使命,他成了一個(gè)構(gòu)造函數(shù)
那么構(gòu)造函數(shù)有什么用呢? 用處就是,他會(huì)返回一個(gè)對(duì)象
function func1(){ this.name = "一號(hào)狗子"; } function func2(){ this.name = "二號(hào)狗子"; } var dog = new func1(); // dog1獲得了一個(gè)對(duì)象 var dog = func2(); // dog2什么都沒(méi)有,因?yàn)楹瘮?shù)沒(méi)有返回任何東西 當(dāng)對(duì)函數(shù)使用new修飾符時(shí),函數(shù)的內(nèi)部的this的指向則是返回的那個(gè)對(duì)象,這是js引擎的背后的行為
call apply
call和apply說(shuō)白了就是改變this指向的兩個(gè)方法,這兩個(gè)方法屬于function類型,所以只要一個(gè)變量的原型鏈上有function,那么它就有call和apply方法
既然說(shuō)道改變this指向,怎么改變呢?
我們回到第一個(gè)例子,這里的this我們已經(jīng)知道了是指向obj,能改變嗎?能,試試apply
var obj = { name: "二狗子", bark: function(){ console.log(this); ==> obj console.log("汪汪汪"); } }; obj.bark(); // 第一個(gè)參數(shù)是你需要將this改指 的變量,后面則是需要傳給func的參數(shù),這里我們沒(méi)有給bark傳,所以沒(méi)寫 // func.apply(context, arg...) obj.bark.apply(window);
就這么簡(jiǎn)單,call也是一樣的使用方式,只是call和apply處理傳入?yún)?shù)的方式有一小點(diǎn)區(qū)別,
就是call()方法接受的是一個(gè)參數(shù)列表,而apply()方法接受的是一個(gè)包含多個(gè)參數(shù)的數(shù)組。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82607.html
摘要:理解文章中已經(jīng)比較全面的分析了在中的指向問(wèn)題,用一句話來(lái)總結(jié)就是的指向一定是在執(zhí)行時(shí)決定的,指向被調(diào)用函數(shù)的對(duì)象。與和直接執(zhí)行原函數(shù)不同的是,返回的是一個(gè)新函數(shù)。這個(gè)新函數(shù)包裹了原函數(shù),并且綁定了的指向?yàn)閭魅氲摹? 理解 JavaScript this 文章中已經(jīng)比較全面的分析了 this 在 JavaScript 中的指向問(wèn)題,用一句話來(lái)總結(jié)就是:this 的指向一定是在執(zhí)行時(shí)決定的,...
摘要:也就是說(shuō),區(qū)別就是,當(dāng)你希望改變上下文環(huán)境之后并非立即執(zhí)行,而是回調(diào)執(zhí)行的時(shí)候,使用方法而則會(huì)立即執(zhí)行函數(shù)。 - call、apply:在 javascript 中,call 和 apply 都是為了改變某個(gè)函數(shù)運(yùn)行時(shí)的上下文(context)而存在的,換句話說(shuō),就是為了改變函數(shù)體內(nèi)部 this 的指向。 JavaScript 的一大特點(diǎn)是,函數(shù)存在「定義時(shí)上下文」和「運(yùn)行時(shí)上下文」以...
摘要:不能應(yīng)用下的等方法。首先我們可以通過(guò)給目標(biāo)函數(shù)指定作用域來(lái)簡(jiǎn)單實(shí)現(xiàn)方法保存,即調(diào)用方法的目標(biāo)函數(shù)考慮到函數(shù)柯里化的情況,我們可以構(gòu)建一個(gè)更加健壯的這次的方法可以綁定對(duì)象,也支持在綁定的時(shí)候傳參。原因是,在中,多次是無(wú)效的。 bind 是返回對(duì)應(yīng)函數(shù),便于稍后調(diào)用;apply 、call 則是立即調(diào)用 。 apply、call 在 javascript 中,call 和 apply 都是...
摘要:可能上面的例子不是很常見(jiàn),但是我們經(jīng)常見(jiàn)到這樣的代碼你好美女你好美女方法是數(shù)組特有的方法,它是定義在構(gòu)造函數(shù)的原型中的方法,所以我們實(shí)例化的數(shù)組就都繼承了這個(gè)方法,但是字符串是沒(méi)有方法,但此處我們就借用了數(shù)組的方法來(lái)處理字符串。 ??在學(xué)習(xí)javascript的時(shí)候,對(duì)于call()和apply()的用法總是難以理解,相信很多小伙伴和我又一樣的想法。現(xiàn)在和小伙伴們分享一下。 call ...
摘要:具體可參考下面代碼定義到原型鏈上的方法這里沒(méi)有繼承父類中的方法張三張三太史公曰總結(jié)一下與兄弟倆的任務(wù)使用一個(gè)指定的值和若干個(gè)指定的參數(shù)值的前提下調(diào)用某個(gè)函數(shù)或方法。本篇人物小傳自此結(jié)束。 在JavaScript中,有這么倆貨,一個(gè)叫call,一個(gè)叫apply,它們倆工作幾乎一毛一樣,但是也有所區(qū)別,曾經(jīng)對(duì)這個(gè)知識(shí)點(diǎn)非常困惑,看過(guò)幾篇博客也沒(méi)搞清楚這哥倆到底打算要干個(gè)啥,直到某天仔細(xì)研究...
閱讀 2052·2023-04-25 15:11
閱讀 3516·2021-09-23 11:57
閱讀 1388·2021-07-26 23:38
閱讀 1328·2019-08-30 15:54
閱讀 646·2019-08-30 15:53
閱讀 3257·2019-08-26 13:36
閱讀 998·2019-08-26 12:01
閱讀 2873·2019-08-23 16:21