首頁  >  文章  >  web前端  >  JavaScript的call方法,apply方法,caller屬性,callee屬性的程式碼詳解

JavaScript的call方法,apply方法,caller屬性,callee屬性的程式碼詳解

黄舟
黄舟原創
2017-03-18 15:14:351269瀏覽


js的call方法_apply方法_caller屬性_callee屬性

一、call 方法
呼叫一個物件的一個方法,以另一個物件替換當前物件(其實就是更改物件的內部指針,即改變物件的this指向的內容)。

Js程式碼

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

參數
thisObj
可選項。將被用作當前對象的對象。
arg1, arg2,  , argN
可選項。將會被傳遞方法參數序列。
說明
call 方法可以用來取代另一個物件呼叫一個方法。 call 方法可將一個函數的物件上下文從初始的上下文變更為由 thisObj指定的新物件。如果沒有提供 thisObj 參數,那麼 Global 物件被用作 thisObj。

Js程式碼

<input type=“text”id=“myText”value=“input text”>
<script>
functionObj(){this.value=“对象!”;}
varvalue=“global 变量”;
functionFun1(){alert(this.value);}

window.Fun1();   //global 变量
Fun1.call(window);  //global 变量
Fun1.call(document.getElementByIdx_x_x(‘myText’));//input text
Fun1.call(new Obj());//对象!
</script>

Js程式碼

varfirst_object = {
num: 42
};
varsecond_object = {
num: 24
};
functionmultiply(mult) {
returnthis.num * mult;
}
multiply.call(first_object, 5); // returns 42 * 5
multiply.call(second_object, 5); // returns 24 * 5

#二、apply方法
apply方法的第一個參數也是要傳入給當前對象的對象,即函數內部的this。後面的參數都是傳遞給目前物件的參數。
對於apply和call兩者在作用上是相同的,但兩者在參數上有區別的。對於第一個參數意義都一樣,但對第二個參數:apply傳入的是一個參數數組,也就是將多個參數組合成為一個數組傳入,而call則作為call的參數傳入(從第二個參數開始)。
如func.call(func1,var1,var2,var3)對應的apply寫法為:func.apply(func1,[var1,var2,var3])同時使用apply的好處是可以直接將當前函數的arguments對象作為apply的第二個參數傳入。

Js程式碼

var func=newfunction(){this.a=“func”}
varmyfunc=function(x,y){
vara=“myfunc”;
alert(this.a);
alert(x + y);
}
myfunc.call(func,“var”,“ fun”);// ”func” ”var fun”
myfunc.apply(func,["var"," fun"]);// ”func” ”var fun”

三、caller 屬性
#傳回一個對函數的引用,也就是呼叫了目前函數的函數體。
functionName.caller :functionName 物件是所執行函數的名稱。
說明:
對函數來說,caller 屬性只有在函數執行時才有定義。 如果函數是由 JScript 程式的頂層呼叫的,那麼 caller包含的就是 null 。如果在字串上下文中使用 caller 屬性,那麼結果和 functionName.toString一樣,也就是說,顯示的是函數的反編譯文字。

Js程式碼

<script>
functionCallLevel(){
if(CallLevel.caller ==null)
alert(“CallLevel was called from the top level.”);
else
alert(“CallLevel was called by another function:\n”+CallLevel.caller);
}
functionfunCaller(){
CallLevel();
}
CallLevel();
funCaller()
</script>

四、callee屬性
傳回正被執行的 Function 對象,也就是所指定的 Function 物件的正文。
[function.]arguments.callee:可選項 function 參數是目前正在執行的 Function物件的名稱。
說明:
callee 屬性的初始值就是正被執行的 Function 物件。
callee 屬性是arguments 物件的一個成員,它表示對函數物件本身的引用,這有利於匿
函數的遞歸或保證函數的封裝性,例如下邊範例的遞歸計算1到n的自然數之和。而該屬性
僅當相關函數正在執行時才可用。還有要注意的是callee擁有length屬性,這個屬性有時會
用來驗證還是比較好的。 arguments.length是實參長度,arguments.callee.length是
形參長度,由此可以判斷調用時形參長度是否和實參長度一致。

Js程式碼

//callee可以打印其本身
functioncalleeDemo() {
alert(arguments.callee);
}
//用于验证参数
functioncalleeLengthDemo(arg1, arg2) {
if(arguments.length==arguments.callee.length) {
window.alert(“验证形参和实参长度正确!”);
return;
} else{
alert(“实参长度:”+arguments.length);
alert(“形参长度: ”+arguments.callee.length);
}
}
//递归计算
var sum =function(n){
if(n <= 0)
return 1;
else
returnn +arguments.callee(n - 1)
}

五、bind

Js程式碼

<script type=“text/javascript”>
varfirst_object = {
num: 42
};
varsecond_object = {
num: 24
};

functionmultiply(mult) {
returnthis.num * mult;
}

Function.prototype.bind = function(obj) {
var method =this,
temp = function() {
returnmethod.apply(obj, arguments);
};

return temp;
}

varfirst_multiply = multiply.bind(first_object);
first_multiply(5); // returns 42 * 5

varsecond_multiply = multiply.bind(second_object);
second_multiply(5); // returns 24 * 5
</script>

以上是JavaScript的call方法,apply方法,caller屬性,callee屬性的程式碼詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn