Javascript 函數的學習
每一個 Javascript 函數都能在自己作用域內訪問一個特殊的變量 - arguments。這個變量含有一個傳遞給函數的所有參數的列表。
arguments 對象不是一個數組。儘管在語法上它跟數組有相同的地方,例如它擁有 length 屬性。但它並不是從 otype 繼承而來,實際上,它就是一個對象。
因此,我們不能直接對 arguments 使用一些數組的方法,例如 push, pop 或 slice 等。 所以為了使用這些方法,我們就需要將其轉換為一個真正的數組。
轉化為數組
下面的代碼將會返回一個包含 arguments 對象所有元素的數組。
(arguments);
由於轉化的速度很慢,所以在性能要求嚴格的程序中不建議這樣做。
傳遞參數
下面是一種比較推薦的方法,將 arguments 對象從一個函數傳遞到另一個函數。
複製代碼 代碼如下:
function foo() {
y(null, arguments);
}
function bar(a, b, c) {
// do stuff here
}
另外還有一個比較巧妙的方法,就是同時使用 call 和 apply 快速創建一個解綁的外層方法。
複製代碼 代碼如下:
function Foo() {}
od = function(a, b, c) {
(this, a, b, c);
};
// Create an unbound version of "method"
// It takes the parameters: this, arg1,
od = function() {
// Result: (this, arg1, arg2... argN)
y(od, arguments);
};
函數形參和 arguments 屬性的關係
arguments 對象為它自身屬性和函數的形參都創建了 getter 和 setter 方法。
因此,修改函數的形參會影響對應的 arguments 對象的屬性值,反之亦然。
複製代碼 代碼如下:
function foo(a, b, c) {
arguments[0] = 2;
a; // 2
b = 4;
arguments[1]; // 4
var d = c;
d = 9;
c; // 3
}
foo(1, 2, 3);
性能問題
arguments 只在兩種情況下不會被創建,一是在函數內部被聲明為局部變量,二是當做函數的形參。其他情況,arguments 對象總是會被創建。
由於 getter 和 setter 方法總是會隨着 arguments 對象的創建而創建,因此使用 arguments 對性能本身幾乎沒有影響。
然而,有一種情形會嚴重影響 Javascript 的性能,那就是使用 ee。
複製代碼 代碼如下:
function foo() {
ee; // do something with this function object
er; // and the calling function object
}
function bigLoop() {
for(var i = 0; i < 100000; i++) {
foo(); // Would normally be inlined...
}
}
在上述代碼中,foo 函數不再是一個簡單的內聯擴展,因為它需要知道它自身以及它的調用者(caller)。這不僅抵消了內聯擴展所帶來的`性能提升,同時也破壞了函數的封裝性,因為函數本身可能需要依賴於一個特定的調用背景。
因此,建議大家儘量不要使用 ee。
以上就是關於Javascript arguments 對象的全部內容了,小夥伴們是否瞭解透徹呢,簡單的説arguments指函數的參數對象(指實際傳入的參數)th指函數的參數對象的長度。 arguments[i]指第i個參數的值(第一個為0)
-
萬惡的function在javascript中的運用實例分析
javascript中最有特色而又讓你困惑的function算一個了下面看一下常用操作複製代碼代碼如下:functiondoit(){.....}doit();javascript中的函數我們可以把它當作方法使用複製代碼代碼如下:varobj=newObject();=function(){.....}();而function實際上就是對象(即F...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想説説javascript中函數的隱含參數:argumentsarguments該對象代表正在執行的函數和調用它的函數的參數。[function.]arguments[n]參數function:選項。當前正在執行的Function對象的名字。n:選項。要傳遞給Function對象的從0開始的參數值...
-
JavaScript與用户端教程
一頁面輸出1.頭部文件複製代碼代碼如下:2.複製代碼代碼如下:3.外部文件4.利用頁面ID的innerHtml複製代碼代碼如下:5.警告alert("廣州百匯物流有限公司");6.詢問複製代碼代碼如下:if(confirm("是否訪問我們的首頁")){alert("是的',前往");}else{alert("退出");}...
-
wap和app手機網站的不同
手機功能的越來越強大,手機App的市場是越來越火爆,時代在更新隨之而來的事物也在更新,不能更上時代的步伐是落後的表現,所以不僅僅是手機APP在完善,手機網站WAP也在不斷的改進中,可是app和wap手機網站有什麼不同呢?yjbys小編從五大方面分析app和wap手機網站的...