js中call的使用問題,jscall

本文目錄一覽:

Js中call和apply的區別和用法是什麼?

JavaScript中有一個call和apply方法,其作用基本相同,但也有略微的區別。

先來看看JS手冊中對call的解釋:

call 方法

調用一個對象的一個方法,以另一個對象替換當前對象。

call([thisObj[,arg1[, arg2[, [,.argN]]]]])

參數

thisObj

可選項。將被用作當前對象的對象。

arg1, arg2, , argN

可選項。將被傳遞方法參數序列。

說明

call 方法可以用來代替另一個對象調用一個方法。call 方法可將一個函數的對象上下文從初始的上下文改變為由 thisObj 指定的新對象。

如果沒有提供 thisObj 參數,那麼 Global 對象被用作 thisObj。

說明白一點其實就是更改對象的內部指針,即改變對象的this指向的內容。這在面向對象的js編程過程中有時是很有用的。

input type=”text” id=”myText” value=”input text”

script

function Obj(){this.value=”對象!”;}

var value=”global 變量”;

function Fun1(){alert(this.value);}

window.Fun1(); //global 變量

Fun1.call(window); //global 變量

Fun1.call(document.getElementById(‘myText’)); //input text

Fun1.call(new Obj()); //對象!

/script

call函數和apply方法的第一個參數都是要傳入給當前對象的對象,及函數內部的this。後面的參數都是傳遞給當前對象的參數。

運行如下代碼:

script

var func=new function(){this.a=”func”}

var myfunc=function(x){

var a=”myfunc”;

alert(this.a);

alert(x);

}

myfunc.call(func,”var”);

/script

可見分別彈出了func和var。到這裡就對call的每個參數的意義有所了解了。

對於apply和call兩者在作用上是相同的,但兩者在參數上有區別的。

對於第一個參數意義都一樣,但對第二個參數:

apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。

如 func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])

同時使用apply的好處是可以直接將當前函數的arguments對象作為apply的第二個參數傳入

在JS中,call()方法和apply()方法到底該怎麼應用?

1.apply與call是更改對象的內部指針,即改變對象的this指向的內容;

2.call與apply的第一個參數都是要傳入給當前對象的對象,及函數內部的this,後面的參數都是傳遞給當前對象的參數。

詳細用法如下:

1.call()

語法:obj1.call(obj2[,param1,param2,…]);

定義:用obj2對象來代替obj1,調用obj1的方法。即將obj1應用到obj2上;

說明:call 方法可以用來代替另一個對象調用一個方法,call 方法可將一個函數的對象上下文從初始的上下文改變為由 obj2 指定的新對象,如果沒有提供 obj2參數,那麼 Global 對象被用作 obj2。

2.apply()

語法:obj1.call(obj2[,arrArg]);

定義:用obj2對象來代替obj1,調用obj1的方法,即將obj1應用到obj2上,

說明:call ()和apply()作用一樣,但是call()可以接收任何類型的參數,而apply()只能接收數組參數。

3.基本用法

4.繼承特性

js中的call

java中對象包含屬性和方法, 方法即函數, 只有對象可以調用方法

但是js中一切皆對象, 函數是對象, 函數也可以調用方法

Function.prototype.call

Function.prototype.apply

Function.prototype.bind

Function.prototype.toString

為什麼js語言會在function原型上掛上這四個函數?

因為好處太多了, 現在我就說一說call的應用

再深入思考一下, call語法是基於什麼形成的呢 ?

了解底層語法有助於我們理解高級的語法

因為在底層的語法眼中, 高級語法只不過是工具, 根本不算語法, 不過是由我定義構建處理來的

理解call函數, 核心必要知識

哈哈哈, v8內部的不知道, 反正js基於現有語法就有這個能力 (還有解法, 基於 proto ,原型鏈的方式, var temp = Object.create(null)), 利用乾淨的地方, 防止覆蓋原對象的函數

顯然, 我們自己的上面的mycall還要很多問題

這裡我們就實現了自己的call, 以後看見call就知道都不過是些雕蟲小技了(當然真實的實現方式肯定需要考慮更多因素和性能, 而且在v8更大的環境下, 可能還不止一種實現方式,保持謙虛)

如何理解和熟練運用js中的call及apply

概念:

call 和 apply 都是為了改變某個函數運行時的 context 即上下文而存在的。換句話說,就是為了改變函數體內部 this 的指向。

例如:

通過document.getElementsByTagName選擇的dom 節點是一種類似array的array。它不能應用Array下的push,pop等方法。我們可以通過:

var domNodes = Array.prototype.slice.call(document.getElementsByTagName(“*”));

這樣domNodes就可以應用Array下的所有方法了。

所以,可以看出call和apply是為了動態改變this而出現的,當一個object沒有某個方法,但是其他的有,我們可以藉助call或apply用其它對象的方法來操作。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/254238.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-14 17:41
下一篇 2024-12-14 17:41

相關推薦

發表回復

登錄後才能評論