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)
-
針對dom元素的分析應用
如果這個DOM元素沒有樣式也就談不上操作了。2.我們也可以直接用JS動態的向html裡寫入DOM元素。今天這章我們就講這兩個應用(一)對html裡現有的DOM元素進行操作。我上面說了,對現有的DOM元素進行操作,無非就是對樣式的操作。所以我們首先就要能獲取這個DOM元素的樣...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想說說javascript中函式的隱含引數:argumentsarguments該物件代表正在執行的函式和呼叫它的函式的引數。[function.]arguments[n]引數function:選項。當前正在執行的Function物件的名字。n:選項。要傳遞給Function物件的從0開始的引數值...
-
如何理解Javascript的caller,callee,call,apply區別
在提到上述的概念之前,首先想說說javascript中函式的隱含引數:argumentsarguments該物件代表正在執行的函式和呼叫它的函式的引數。[function.]arguments[n]引數function:選項。當前正在執行的Function物件的名字。n:選項。要傳遞給Function物件的從0開始的引數值...
-
解決PHP中的Cannot modify header information 問題
我就遇到這種問題,網上找到這個解決的方案,就收藏下寫PHP的朋友們肯定遇到過這樣一個問題:通過header函式改變http協議頭的時候,會出現一個類似下面格式的warning:複製程式碼程式碼如下:Warning:Cannotmodifyheaderinformation-headersalreadysentby這是為什麼呢?因為在...