簡體   English   中英

如何在JavaScript函數中使用可變數量的參數

[英]How to use a variable number of arguments in a JavaScript function

當有多個參數時,我很難理解如何將信息從第二個函數返回到第一個函數。 現在,我知道以下代碼有效。

function One() {
    var newVal = 0;
    newVal = Too(newVal);
    console.log(newVal);
}

function Too(arg) {
    ++arg;
    return arg;
}

但是,如果我嘗試通過添加參數和setinterval使事情復雜化怎么辦?

function One() {
    var newVal = 0;
    var z = 3;
    var y = 3;
    var x = 1;
    newVal = Too(newVal);
    var StopAI2 = setInterval(function () {
        Too(x, y, z, newVal)
    }, 100);
}

function Too(Xarg, Yarg, Zarg, newValarg) {
    Xarg*Xarg;
    Yarg*Yarg;
    Zarg*Zarg;
    ++newValarg;
    return newValarg;
}

我不確定如何處理newVal =代碼行。 我只想返回newVal而不是x,y,z。

我想這就是您要問的問題:

僅傳遞一個參數時,如何對函數的第四個參數進行操作?

這個問題的答案是這樣的:

如果要對函數的第4個參數進行操作,則必須至少將4個參數傳遞給該函數。

您可以通過幾種方法來不同地解決問題。

#1

如果總是有一個參數,請確保它是第一個參數:

 function Too(mandatoryArg, optionalArg1, optionalArg2) {
    alert(++mandatoryArg);
    if (optionalArg1) {
        alert(++optionalArg1);
    }
}

#2

為所有未定義或未知參數傳遞占位符值。

您可以使用nullundefined''

alert(Too(null, null, 4));

function Too(optArg1, optArg2, mandatoryArg) {
    alert(++mandatoryArg);
}

#3

根據參數數量做出決定:

function Too(optArg1, optArg2, optArg3) {
    var numArgs = arguments.length;
    if (numArgs === 1) {
        alert(++optArg1);
    }
    if (numArgs === 3) {
        alert(++optArg3);
    }
}


編輯

“這會更新第一個函數中的變量嗎?”

讓我們用一個實際的例子演示一下:

function one() {
    var a = 0;
    var b = 25;
    var c = 50;
    var d = -1;

    d = two(a, b, c);

    alert("a: " + a);
    alert("b: " + b);
    alert("c: " + c);
    alert("d: " + d);
}

function two(a, b, c) {
    ++a;
    ++b;
    ++c;
    if (arguments.length === 1) {
        return a;
    }
    if (arguments.length === 3) {
        return c;
    }
}

調用one()將導致以下警報:

a: 0
b: 25
c: 50
d: 51

在函數one()中僅修改d的值。

這是因為d被分配了two()的返回值。

two()內部對abc的更改對one()內部的abc的值沒有影響。

即使將two()的參數命名為abc ,情況也是如此。

這是上面代碼的擺弄



編輯#2

這是創建移動游戲對象的函數的一種方法:

var FORWARD = 0;
var BACK = 1;
var LEFT = 2;
var RIGHT = 3;

// use an object with three values to represent a position
var pos = {
    x: 0,
    y: 0,
    z: 0
};

pos = moveObject(pos, FORWARD);
printPosition(pos);

pos = moveObject(pos, LEFT);
printPosition(pos);

pos = moveObject(pos, FORWARD);
printPosition(pos);

pos = moveObject(pos, LEFT);
printPosition(pos);

// invoking moveObject() with one argument
// will move the object forward

pos = moveObject(pos);
printPosition(pos);

function moveObject(position, direction) {

    // assume FORWARD if no direction is specified
    if (typeof direction === 'undefined') {
        direction = FORWARD;
    }

    if (direction === FORWARD) {
        ++position.z;
    }
    if (direction === BACK) {
        --position.z;
    }
    if (direction === LEFT) {
        --position.x;
    }
    if (direction === RIGHT) {
        ++position.x;
    }

    return position;
}

function printPosition(pos) {
    alert(pos.x + ", " + pos.y + ", " + pos.z);
}

這是一個小提琴 ,展示了另一種方法的可行演示。

這里有兩個概念在起作用。

1。 可變數量的功能參數(或可選參數)。

如果要使用不同數量的參數調用同一函數(最終將導致頭痛),則需要確定(在函數內部)如何調用此函數。 您可以使用每個函數內部可用的arguments對象:

function Too() {
  if (arguments.length == 4) {
    arguments[0]*arguments[0];
    arguments[1]*arguments[1];
    arguments[2]*arguments[2];
    return ++arguments[3];
  } else if (arguments.length == 1) {
    return ++arguments[0];
  } else {
    // you decide what to do here
  }
}

2。 異步代碼執行。

意識到時間間隔到期時調用的Too ,在One完成並返回后執行良好。 如果你想Too影響newVal變量,並在這個新的價值某種方式得到之后, -使newVal可變全球。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM