摘要:使用將的改為了對(duì)象上面這個(gè)例子可以很直觀地理解的工作原理。所以在執(zhí)行時(shí),函數(shù)內(nèi)部的則會(huì)自動(dòng)指向。這是一個(gè)非常好理解的例子。當(dāng)執(zhí)行這個(gè)方法時(shí),獲得的屬性和方法。因此執(zhí)行時(shí)返回。這證明了我們上面的推理是正確的。
js中一個(gè)主要的內(nèi)容就是this的指向問題.
apply() 和 call() 這兩個(gè)方法有共同之處也有不同之處
共同之處
他們都能改變this的指向,都是在特定的作用域中調(diào)用函數(shù),等于設(shè)置函數(shù)體內(nèi)this對(duì)象的值,以擴(kuò)充函數(shù)賴以運(yùn)行的作用域。一般來說,this總是指向調(diào)用某個(gè)方法的對(duì)象,但是使用call()和apply()方法時(shí),就會(huì)改變this的指向。
說到他們的功能,我就拿call來舉例子吧,因?yàn)樗麄兊墓δ苁且恢碌摹?/p>
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
call()方法就是用來代替另一個(gè)對(duì)象來調(diào)用這個(gè)方法。call()將一個(gè)函數(shù)的對(duì)象上下文從初始的變?yōu)樾露x的新對(duì)象thisObj。如果沒有這個(gè)對(duì)象,那么就用global來代替.
不同之處
不同之處在于他們傳值的方式不同
apply和call兩者在作用上是相同的,但兩者在參數(shù)上有區(qū)別的。對(duì)于第一個(gè)參數(shù)意義都一樣,但對(duì)第二個(gè)參數(shù):apply傳入的是一個(gè)參數(shù)數(shù)組,也就是將多個(gè)參數(shù)組合成為一個(gè)數(shù)組傳入,而call則作為call的參數(shù)傳入(從第二個(gè)參數(shù)開始)。如 func.call(func1,var1,var2,var3)對(duì)應(yīng)的 apply 寫法為:func.apply(func1,[var1,var2,var3])。
function sayName(){ alert(this.name); } var p = { name: "zjj" }; sayName.call(p); // zjj //使用call將sayName的this改為了p對(duì)象
上面這個(gè)例子可以很直觀地理解 call 的工作原理。也就是說,當(dāng)在函數(shù)中調(diào)用 call 這個(gè)方法時(shí),函數(shù)內(nèi)部的 this 對(duì)象會(huì)自動(dòng)指向 call 方法中的第一個(gè)參數(shù)。在上面這個(gè)例子中也就是 peter 這個(gè)對(duì)象了。所以在執(zhí)行 sayName.call(peter) 時(shí),函數(shù)內(nèi)部的 this.name 則會(huì)自動(dòng)指向 peter.name 。故最終結(jié)果為 peter。這是一個(gè)非常好理解的例子。接下來來看較為復(fù)雜的情況。
call()
function person(){ this.name = "zjj"; this.say = function() { console.log(this.name); } } function person1(){ this.name = "zmf"; } var sm = new Person1(); person.call(sm); //將person的this指向改為了sm sm.say(); // 這里之所以能使用say,是因?yàn)楝F(xiàn)在sm指向了person,有say這個(gè)方法;
window.color = "red"; document.color = "yellow"; var s1 = {color: "blue" }; function changeColor(){ console.log(this.color); } changeColor.call(); //red (默認(rèn)傳遞參數(shù)) changeColor.call(window); //red changeColor.call(document); //yellow changeColor.call(this); //red changeColor.call(s1); //blue
// 在call中傳入函數(shù) function class1 () { this.message = "yeah"; } function class2 () { this.sayMessage = function () { alert(this.message); } } class2.call(class1); // 可以理解為class2給了class1; alert(class1.sayMessage); // 因?yàn)榧词故菍lass2的給了class1,但是sayMessage中的this.message仍然還是class2的。 class1.sayMessage(); //undefined
var message = "hi"; function class1 () { this.message = "yeah"; } function class2 () { this.message = "hello"; this.sayMessage = function () { alert(this.message); } } class2.call(class1); alert(class1.sayMessage); class1.sayMessage(); // hello class1.message = "msg"; class1.sayMessage(); //msg
第一次調(diào)用 sayMessage 方法,返回 hello 。我們?cè)賮砜匆幌?class2.call(class1) 這個(gè)過程。當(dāng)執(zhí)行這個(gè)方法時(shí),class1 獲得 class2 的 message 屬性和 sayMessage 方法。所以此時(shí)有 class1.message = "hello" ,class1.sayMessage = function () {alert(this.message)}。因此執(zhí)行 sayMessage 時(shí)返回 hello。當(dāng)我們手動(dòng)修改 class1.message 時(shí),再調(diào)用這個(gè)方法,返回的值為我們修改的值。這證明了我們上面的推理是正確的。
apply()
function add(c,d){ return this.a + this.b + c + d; } var s = {a:1, b:2}; console.log(add.call(s,3,4)); // 1+2+3+4 = 10 console.log(add.apply(s,[5,6])); // 1+2+5+6 = 14
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/94992.html
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ì)象來使用的,對(duì)象可以調(diào)用方法 f1.apply(); // 結(jié)果是:NaN[object Window] f1.ca...
摘要:的作用在中,方法和方法都是為了改變函數(shù)運(yùn)行時(shí)上下文而存在的,換句話說就是為了改變函數(shù)體內(nèi)部的指向。歡迎前端大牛糾正錯(cuò)誤,如有錯(cuò)誤我會(huì)及時(shí)改正。 寫在前面: 隔了很長時(shí)間了,也不知道寫點(diǎn)什么。最近一直在研究ES6,一直想寫出來的文章能對(duì)初學(xué)者或者是在學(xué)習(xí)JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
摘要:三個(gè)方法的作用,都是改變的指向,只是用法稍微有些區(qū)別什么是既不指向函數(shù)自身,也不指函數(shù)的詞法作用域。它在函數(shù)定義的時(shí)候是確定不了的在函數(shù)被調(diào)用時(shí)才發(fā)生的綁定,也就是說具體指向什么,取決于你是怎么調(diào)用的函數(shù)。 1.排序法 思路:給數(shù)組先排序(由大到小排序),第一項(xiàng)就是最大值 let arr = [1,5,6,7,9,20,40,2,3]; let max1 = arr.sort(func...
摘要:本文總結(jié)了的各種情況,并從規(guī)范的角度探討了的具體實(shí)現(xiàn),希望對(duì)大家理解有所幫助。規(guī)范規(guī)范里面詳細(xì)介紹了的實(shí)現(xiàn)細(xì)節(jié),通過閱讀規(guī)范,我們可以更準(zhǔn)確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯(cuò)誤的地方還望指出。 this是面向?qū)ο缶幊讨械囊粋€(gè)概念,它一般指向當(dāng)前方法調(diào)用所在的對(duì)象,這一點(diǎn)在java、c++這類比較嚴(yán)格的面向?qū)ο缶幊陶Z言里是非常明確的。但是在javascript...
摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個(gè)函數(shù),但是執(zhí)行結(jié)果可能不一樣。該變量由運(yùn)行環(huán)境提供。所以,就出現(xiàn)了,它的設(shè)計(jì)目的就是在函數(shù)體內(nèi)部,指代函數(shù)當(dāng)前的運(yùn)行環(huán)境。 深入淺出this的理解 問題的由來 var obj = { foo: function(){} } var foo = obj.foo; // 寫法一 obj.foo(); // 寫法二 foo...
閱讀 2970·2021-11-22 15:25
閱讀 2251·2021-11-18 10:07
閱讀 1057·2019-08-29 15:29
閱讀 483·2019-08-29 13:25
閱讀 1515·2019-08-29 12:58
閱讀 3211·2019-08-29 12:55
閱讀 2923·2019-08-29 12:28
閱讀 514·2019-08-29 12:16