apply 與 call 介紹
function f1(x, y) { console.log("結(jié)果是:" + (x + y) + this); } f1(10, 20); //函數(shù)的調(diào)用 // 結(jié)果是:30[object Window] // 此時(shí)的 f1 實(shí)際上是當(dāng)作對(duì)象來(lái)使用的,對(duì)象可以調(diào)用方法 f1.apply(); // 結(jié)果是:NaN[object Window] f1.call(); // 結(jié)果是:NaN[object Window] f1.apply(null); // 結(jié)果是:NaN[object Window] f1.call(null); // 結(jié)果是:NaN[object Window]
apply 和 call 方法中如果沒(méi)有傳入?yún)?shù),或者傳入的是null,那么調(diào)用該方法的函數(shù)對(duì)象中的 this 就是默認(rèn)的 window
apply 和 call 都可以讓函數(shù)或者方法來(lái)調(diào)用,傳入?yún)?shù)和函數(shù)自己調(diào)用的寫(xiě)法不一樣,但是效果是一樣的。
f1.call(null,10,20); // 結(jié)果是:30[object Window] f1.apply(null,[10,20]); // 結(jié)果是:30[object Window]
基本使用
function f2(x, y ){ console.log("結(jié)果:"+(x+y)+" "+ this.age ); } window.f2(10, 20); //結(jié)果:30 undefined // obj是一個(gè)對(duì)象 var obj = { age: 10, sex: "男" }; window.f2.apply(obj,[10, 20]); //結(jié)果:30 10 window.f2.call(obj,10,20); //結(jié)果:30 10 console.dir(obj); // age: 10 sex: "男"apply與call的作用:改變this的指向
apply 和 call可以改變 this 的指向例子1:用于方法
function Person(age, sex){ this.age = age; this.sex = sex; } //通過(guò)原型添加方法 Person.prototype.sayHi=function(){ console.log("您好呀:"+this.sex); } var per = new Person(10,"男"); per.sayHi(); // 您好呀:男 function Student(name, sex){ this.name = name; this.sex = sex; } var stu=new Student("小明", "女"); per.sayHi.apply(stu); // 您好呀:女 per.sayHi.call(stu); // 您好呀:女 // stu 沒(méi)有 sayHi(),但是通過(guò)apply或call可以讓它調(diào)用per的sayHi().例子2:用于函數(shù)
function f(x, y){ console.log("結(jié)果是:"+(x+y)+" "+this); return "此時(shí)的this是"+this; } // apply和call調(diào)用 var r1=f.apply(null,[1,2]); // 此時(shí)f中的this是window console.log(r1); //結(jié)果是:3 [object Window] // 此時(shí)的this是[object Window] var r2=f.call(null,1,2); // 此時(shí)f中的this是window console.log(r2); //結(jié)果是:3 [object Window] // 此時(shí)的this是[object Window] // 改變this的指向 var obj={ sex: "男" } // 本來(lái)f函數(shù)是window對(duì)象的,但是傳入obj之后,f函數(shù)就是obj對(duì)象的 var r3=f.apply(obj,[1,2]); // 此時(shí)f中的this是obj console.log(r3); // 結(jié)果是:3 [object Object] // 此時(shí)的this是[object Object] var r4=f.call(obj,1,2); // 此時(shí)f中的this是obj console.log(r4); // 結(jié)果是:3 [object Object] // 此時(shí)的this是[object Object]apply和call的使用方法總結(jié) apply的使用方法:
函數(shù)名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]); 方法名字.apply(對(duì)象,[參數(shù)1,參數(shù)2,...]);call的使用方法:
函數(shù)名字.call(對(duì)象,參數(shù)1,參數(shù)2,...); 方法名字.call(對(duì)象,參數(shù)1,參數(shù)2,...);apply與call的不同:
參數(shù)傳遞的方式是不一樣的
使用場(chǎng)景只要是想使用別的對(duì)象的方法,并且希望這個(gè)方法是當(dāng)前對(duì)象的,那么就可以使用apply或者是call的方法改變this的指向。
apply和call方法實(shí)際上并不在函數(shù)這個(gè)實(shí)例對(duì)象中,而是在Function的prototye中。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103979.html
摘要:設(shè)計(jì)模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開(kāi)始接觸的時(shí)候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計(jì)模式必須要先搞懂面向?qū)ο缶幊蹋駝t只會(huì)讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學(xué)習(xí)總結(jié)。知識(shí)只有分享才有存在的意義。 是時(shí)候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:本文總結(jié)了的各種情況,并從規(guī)范的角度探討了的具體實(shí)現(xiàn),希望對(duì)大家理解有所幫助。規(guī)范規(guī)范里面詳細(xì)介紹了的實(shí)現(xiàn)細(xì)節(jié),通過(guò)閱讀規(guī)范,我們可以更準(zhǔn)確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯(cuò)誤的地方還望指出。 this是面向?qū)ο缶幊讨械囊粋€(gè)概念,它一般指向當(dāng)前方法調(diào)用所在的對(duì)象,這一點(diǎn)在java、c++這類比較嚴(yán)格的面向?qū)ο缶幊陶Z(yǔ)言里是非常明確的。但是在javascript...
摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說(shuō)就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫(xiě)在前面: 隔了很長(zhǎng)時(shí)間了,也不知道寫(xiě)點(diǎn)什么。最近一直在研究ES6,一直想寫(xiě)出來(lái)的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
摘要:在全局對(duì)象中調(diào)用,自然讀取的是全局對(duì)象的值構(gòu)造器調(diào)用說(shuō)明作為構(gòu)造器調(diào)用時(shí),指向返回的這個(gè)對(duì)象。最直觀的表現(xiàn)就是,去看一些優(yōu)秀框架的源代碼時(shí),不再是被繞的暈乎乎的。 學(xué)習(xí)起因: 在之前的JavaScript學(xué)習(xí)中,this,call,apply總是讓我感到迷惑,但是他們的運(yùn)用又非常的廣泛。遂專門花了一天,來(lái)弄懂JavaScript的this,call,apply。中途參考的書(shū)籍也很多,以...
摘要:理解的函數(shù)基礎(chǔ)要搞好深入淺出原型使用原型模型,雖然這經(jīng)常被當(dāng)作缺點(diǎn)提及,但是只要善于運(yùn)用,其實(shí)基于原型的繼承模型比傳統(tǒng)的類繼承還要強(qiáng)大。中文指南基本操作指南二繼續(xù)熟悉的幾對(duì)方法,包括,,。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。 怎樣使用 this 因?yàn)楸救藢儆趥吻岸耍虼宋闹兄豢炊?8 成左右,希望能夠給大家?guī)?lái)幫助....(據(jù)說(shuō)是阿里的前端妹子寫(xiě)的) this 的值到底...
閱讀 2654·2023-04-25 15:22
閱讀 2824·2021-10-11 10:58
閱讀 1044·2021-08-30 09:48
閱讀 1851·2019-08-30 15:56
閱讀 1730·2019-08-30 15:53
閱讀 1089·2019-08-29 11:16
閱讀 1048·2019-08-23 18:34
閱讀 1638·2019-08-23 18:12