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