2017-05-22 42 views
1

請接受我作爲JS初學者的道歉。 我停止在傳遞參數時在函數內發生什麼正確答案的問題上學習JS,讓我們用代碼片段來描述。當我們在函數內部傳遞參數時會發生什麼?

function myFun(x){ 
    console.log(arguments); 
    console.log(x); 
} 
myFun(1); 

根據上面的示例, 是正確的動作發生的情況是:

實施例1

when passing calling myFun(1) this will do : 
    function myFunction(x){ 
    var x = 1 
    } 

OR 實施例2

function myFunction(x,y,z){ 
    x=arguments[0]; 
    y=arguments[1]; 
    z=arguments[2]; 
    } 

根據main documentation,我沒有找到所需的方法,我在爭論中發現對象的創建過程爲:

重複而INDX> = 0, 讓VAL是args來元在0起始列表位置indx。

我不能指定這與分配值的過程有關。

所以根據上述可言,

其解決方案是正確的嗎? 如何將參數分配給參數?如果我們將值1作爲參數傳遞,則在函數作用域中,1將被分配給x或1將被分配給參數Object?

+0

你有什麼問題嗎? –

+0

在您鏈接的評論主題中存在很多混淆,聽起來好像你被所有這些混淆了。沒有「任務」,只是參數傳遞。 –

+0

@NiettheDarkAbsol:我會編輯這一點 – youhana

回答

0

比方說,你有這樣的函數:

function oneParam(x) 
{ 
    console.log(arguments[0]); 
    console.log(x); 
} 

調用它像這樣:oneParam(1);會把傳入,進入參數數組的第一個參數。如果你運行上面的代碼,你會得到相同的值打印兩次,因爲它們是相同的。

1

1


現在,讓我們的功能與多個PARAMS:

function myFunction(x,y,z) 
{ 
    console.log(arguments[0], arguments[1], arguments[2]); 

    x=arguments[0]; 
    y=arguments[1]; 
    z=arguments[2]; 

    console.log(x, y, z); 
} 

你會發現,那個叫這樣myFunction("a","b","c");這個功能將產生兩個類似的輸出。

a b c

a b c

所以基本上,這兩種情況都是正確的。取決於您在調用函數時傳入的內容。


編輯:爲了澄清,arguments對象將有你在通過這些PARAMS會按順序分配給命名變量是那裏的函數簽名的所有PARAMS。

所以你甚至可以有oneParam(1, 2, 3);和參數對象將具有所有三個參數,但只有第一個參數1將被分配給函數變量x。

fiddle here

+0

所以你鼓勵在帖子中提到的第二個例子? – youhana

+0

您不必手動將參數對象的值分配給您的變量。它會自動完成。我只是爲了向你展示幕後發生的事情。 – john

+0

因此,本質上,不要打擾第二個,只是與第一個去。 – john

0

如果你名字的參數在你的函數是這樣的:

function myFunction(x,y,z) 
{ 
    console.log(x, y, z); 
} 

那麼最好由他們的名字直接訪問它們。
如果您在定義函數時不知道參數的數量,例如Math.max(),則可以使用argumens

ES6使用參數比以前稍微簡單一些,但它非常相似。請記住,arguments不是數組,因此如果您想要訪問所有數組的方法,必須將其轉換爲數組。

function myFunc_ES6() { 
    var args = [...arguments]; 
    // or 
    //var args = Object.values(arguments) 

    args.forEach(arg => console.log(arg)); 
} 

function myFunc_ES5() { 
    var args = Array.prototype.slice.apply(arguments); 

    args.forEach(function(arg) { 
     console.log(arg); 
    }); 
} 

myFunc_ES6(1,2,3,4); 
myFunc_ES5(6,7,8,9); 
0

arguments對象 JavaScript函數有一個內置對象叫arguments對象。

參數對象包含調用(調用)函數 時使用的參數數組。

https://www.w3schools.com/js/js_function_parameters.asp

arguments說可以用,當你不希望明確指定函數的參數。這在許多情況下都很有用。例如,

在不同的參數

不同的行爲算

function foo() { 
    if(arguments.length == 2){ 
    // do something 
    }else{ 
    //do something else 
    } 
} 

延長一些方法

var oldMethod = Object.prototype.method; 
Object.prototype.method = function() { 
// some extended functionality 
// then call the original 
oldMethod.apply(this, arguments); 
} 

與參數數目未知的

工作
function average(){ 
    var i, s=0; 

    if(!arguments.length){ 
    throw('Division by zero.'); 
    } 

    for(i=0;i<arguments.length;i++){ 
    s+=arguments[i]; 
    } 
    return s/arguments.length; 
} 

關於價值觀得到分配的方式, 如果我們有一個功能:

function foo(x){} 

無論你在傳遞什麼樣的參數thiswill是真實的:

x === arguemnts[0] 

它幾乎就像x是在參數中被statlyly引用的,因爲在參數上操作也會改變參數:

然而
arguments[0]++; 
x === arguments[0] // true 

刪除參數[0]不會修改明確的參數值

delete arguments[0] 
x !== undefined 
相關問題