摘要:使用將的改為了對象上面這個例子可以很直觀地理解的工作原理。所以在執行時,函數內部的則會自動指向。這是一個非常好理解的例子。當執行這個方法時,獲得的屬性和方法。因此執行時返回。這證明了我們上面的推理是正確的。
js中一個主要的內容就是this的指向問題.
apply() 和 call() 這兩個方法有共同之處也有不同之處
共同之處
他們都能改變this的指向,都是在特定的作用域中調用函數,等于設置函數體內this對象的值,以擴充函數賴以運行的作用域。一般來說,this總是指向調用某個方法的對象,但是使用call()和apply()方法時,就會改變this的指向。
說到他們的功能,我就拿call來舉例子吧,因為他們的功能是一致的。
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
call()方法就是用來代替另一個對象來調用這個方法。call()將一個函數的對象上下文從初始的變為新定義的新對象thisObj。如果沒有這個對象,那么就用global來代替.
不同之處
不同之處在于他們傳值的方式不同
apply和call兩者在作用上是相同的,但兩者在參數上有區別的。對于第一個參數意義都一樣,但對第二個參數:apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。如 func.call(func1,var1,var2,var3)對應的 apply 寫法為:func.apply(func1,[var1,var2,var3])。
function sayName(){ alert(this.name); } var p = { name: "zjj" }; sayName.call(p); // zjj //使用call將sayName的this改為了p對象
上面這個例子可以很直觀地理解 call 的工作原理。也就是說,當在函數中調用 call 這個方法時,函數內部的 this 對象會自動指向 call 方法中的第一個參數。在上面這個例子中也就是 peter 這個對象了。所以在執行 sayName.call(peter) 時,函數內部的 this.name 則會自動指向 peter.name 。故最終結果為 peter。這是一個非常好理解的例子。接下來來看較為復雜的情況。
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,是因為現在sm指向了person,有say這個方法;
window.color = "red"; document.color = "yellow"; var s1 = {color: "blue" }; function changeColor(){ console.log(this.color); } changeColor.call(); //red (默認傳遞參數) changeColor.call(window); //red changeColor.call(document); //yellow changeColor.call(this); //red changeColor.call(s1); //blue
// 在call中傳入函數 function class1 () { this.message = "yeah"; } function class2 () { this.sayMessage = function () { alert(this.message); } } class2.call(class1); // 可以理解為class2給了class1; alert(class1.sayMessage); // 因為即使是將class2的給了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
第一次調用 sayMessage 方法,返回 hello 。我們再來看一下 class2.call(class1) 這個過程。當執行這個方法時,class1 獲得 class2 的 message 屬性和 sayMessage 方法。所以此時有 class1.message = "hello" ,class1.sayMessage = function () {alert(this.message)}。因此執行 sayMessage 時返回 hello。當我們手動修改 class1.message 時,再調用這個方法,返回的值為我們修改的值。這證明了我們上面的推理是正確的。
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
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/94992.html
apply 與 call 介紹 function f1(x, y) { console.log(結果是: + (x + y) + this); } f1(10, 20); //函數的調用 // 結果是:30[object Window] // 此時的 f1 實際上是當作對象來使用的,對象可以調用方法 f1.apply(); // 結果是:NaN[object Window] f1.ca...
摘要:的作用在中,方法和方法都是為了改變函數運行時上下文而存在的,換句話說就是為了改變函數體內部的指向。歡迎前端大牛糾正錯誤,如有錯誤我會及時改正。 寫在前面: 隔了很長時間了,也不知道寫點什么。最近一直在研究ES6,一直想寫出來的文章能對初學者或者是在學習JS路上有所幫助的。這就是我的初衷。 call、apply的作用 在JavaScript中,call()方法和apply()方法都是為了...
摘要:三個方法的作用,都是改變的指向,只是用法稍微有些區別什么是既不指向函數自身,也不指函數的詞法作用域。它在函數定義的時候是確定不了的在函數被調用時才發生的綁定,也就是說具體指向什么,取決于你是怎么調用的函數。 1.排序法 思路:給數組先排序(由大到小排序),第一項就是最大值 let arr = [1,5,6,7,9,20,40,2,3]; let max1 = arr.sort(func...
摘要:本文總結了的各種情況,并從規范的角度探討了的具體實現,希望對大家理解有所幫助。規范規范里面詳細介紹了的實現細節,通過閱讀規范,我們可以更準確的理解上述四種情況到底是怎么回事。由于本人能力有限,如有理解錯誤的地方還望指出。 this是面向對象編程中的一個概念,它一般指向當前方法調用所在的對象,這一點在java、c++這類比較嚴格的面向對象編程語言里是非常明確的。但是在javascript...
摘要:深入淺出的理解問題的由來寫法一寫法二雖然和指向同一個函數,但是執行結果可能不一樣。該變量由運行環境提供。所以,就出現了,它的設計目的就是在函數體內部,指代函數當前的運行環境。 深入淺出this的理解 問題的由來 var obj = { foo: function(){} } var foo = obj.foo; // 寫法一 obj.foo(); // 寫法二 foo...
閱讀 2946·2021-11-22 15:25
閱讀 2240·2021-11-18 10:07
閱讀 1045·2019-08-29 15:29
閱讀 472·2019-08-29 13:25
閱讀 1504·2019-08-29 12:58
閱讀 3201·2019-08-29 12:55
閱讀 2911·2019-08-29 12:28
閱讀 500·2019-08-29 12:16