改变功能参数

时间:2013-01-02 20:36:20

标签: javascript node.js google-apps-script

想要检查传递给函数的参数并替换未指定的参数或“我不喜欢”的参数。为此,我做了以下(我想使用arguments的原因是我希望有一个通用函数)(与node.js相同的结果,只需将Logger更改为控制台):< / p>

function argtest (x,y,z) {
  Logger.log ("at begin x="+x+", y="+y+", z="+z);
  arguments.length=3; // found this somewhere, doesn't help
  arguments[0]="a";
  arguments[1]="b";
  arguments[2]="c";
  Logger.log ("arguments now:");
  for (var i in arguments) {
    Logger.log ("arguments["+i+"]="+arguments[i]);
  }
  Logger.log ("at end x="+x+", y="+y+", z="+z);
}
function callArgTest () {
  argtest ();
  argtest (1,2,3);
}

因此调用callArgTest的结果是:

Logger.log([at begin x=undefined, y=undefined, z=undefined, []])
Logger.log([arguments now:, []])
Logger.log([arguments[0]=a, []])
Logger.log([arguments[1]=b, []])
Logger.log([arguments[2]=c, []])
Logger.log([at end x=undefined, y=undefined, z=undefined, []])
Logger.log([at begin x=1, y=2, z=3, []])
Logger.log([arguments now:, []])
Logger.log([arguments[0]=a, []])
Logger.log([arguments[1]=b, []])
Logger.log([arguments[2]=c, []])
Logger.log([at end x=a, y=b, z=c, []])

因此,参数x,y,z仅在最初指定时才会更改。在第一种情况下(不带参数调用argtest),即使将值赋给参数,它们仍然未定义。那么这里缺少什么让它起作用?请注意,我不想触摸x,y,z。相反,在最终的实现中,我想将参数传递给一个适用于它们的函数。

3 个答案:

答案 0 :(得分:1)

问题在于,在调用argtest()时,arguments实际上没有"0"属性来引用x"1"来{ {1}}等等:

y

ES5 10.6的步骤argtest() => arguments = { "length": 0 } argtest(1,2,3) => arguments = { "length": 3, "0": x, "1": y, "2": z } 中描述了该引用的定义,它定义了11.c的每个“索引”的getter和setter,但受参数数量的限制named和传递的参数数量。

关于你的意图:

  

我想在函数开头的现有实现中调用一个函数,该函数只接受参数和一些默认值作为参数,例如: arguments

你可能会更容易找到这样的东西:

defaults (arguments, "string=nana", "number=4")

你想用ES5做什么,但是意味着用每个“索引”和命名参数的getter和setter定义你自己的“arguments”对象,无论是否传递值,都通过Object.create / Object.definePropertiesget / set - 我不会认为这是“简单”:

function argTest(x, y, z) {
    x = typeof x !== 'undefined' ? x : ...;
    y = typeof y !== 'undefined' ? y : ...;
    // etc.
}

答案 1 :(得分:0)

arguments[0]="a";
arguments[1]="b";
arguments[2]="c";

为什么不添加

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

? 我想有一些理由说明为什么这不符合你的目标,但我想我需要一个更现实的例子才能看到真正符合你目标的东西。

答案 2 :(得分:0)

也许你可以这样做:

var args = Array.prototype.slice.call(arguments);

然后与args合作?你可以将args传递给你需要的其他功能。如果这有助于你,或者我正在咆哮错误的树,请告诉我。