Javascript 改变功能参数
希望检查传递给函数的参数,并替换未指定的参数或“我不喜欢”的参数。为此,我做了以下工作(我之所以要使用Javascript 改变功能参数,javascript,node.js,google-apps-script,Javascript,Node.js,Google Apps Script,希望检查传递给函数的参数,并替换未指定的参数或“我不喜欢”的参数。为此,我做了以下工作(我之所以要使用参数是因为我想让一个通用函数来做这件事)(与node.js的结果相同,只需将Logger更改为console): 因此调用callArgTest的结果是: Logger.log([at begin x=undefined, y=undefined, z=undefined, []]) Logger.log([arguments now:, []]) Logger.log([arguments[0
参数
是因为我想让一个通用函数来做这件事)(与node.js的结果相同,只需将Logger更改为console):
因此调用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。相反,在最终的实现中,我希望将参数传递给一个对其起作用的函数。之后
arguments[0]="a";
arguments[1]="b";
arguments[2]="c";
你为什么不加上
x = arguments[0];
y = arguments[1];
z = arguments[2];
??
我想这不符合你的目标是有原因的,但我想我需要一个更现实的例子来看看什么才真正符合你的目标。也许你可以这样做:
var args = Array.prototype.slice.call(arguments);
然后使用
args
?如果需要,可以将args
传递到其他函数中。请告诉我这是否有助于您,或者我是否找错了方向。问题是,在调用argtest()
时,参数实际上没有“0”
属性来引用x
,或者“1”
来引用y
,等等:
argtest() => arguments = { "length": 0 }
argtest(1,2,3) => arguments = { "length": 3, "0": x, "1": y, "2": z }
该引用的定义在的步骤11.c
中描述,该步骤为参数的每个“索引”定义了getter和setter,但受命名参数的数量和传递参数的数量的限制
关于你的意图:
我想在函数开头的现有实现中加入一个对函数的调用,该函数只将参数和一些默认值作为参数,例如defaults(参数,“string=nana”,“number=4”)
您可能会发现这样的事情更容易:
function argTest(x, y, z) {
x = typeof x !== 'undefined' ? x : ...;
y = typeof y !== 'undefined' ? y : ...;
// etc.
}
你想做的事情是用ES5来做的,但这意味着为每个“索引”和命名参数定义你自己的“参数”对象,无论传递的值与否,通过/或/或,我都不认为这是“简单的”:
当前,您正在成功更改参数[n]
,但它不会影响x
、y
或z
。为什么不使用参数[n]
符号来引用x
,y
,z
?这是什么浏览器?即使在调用函数时没有参数,我也能够为参数赋值。这是在Chrome中。@LarsH-Hmm.x、y和z如果在调用函数(第二次调用argtest)时被指定,只需更改参数[0..2],就会受到影响,所以即使没有指定它们(调用atest()
)@Vivin这是谷歌应用程序脚本,使用javascript作为语言,但是它不是一个浏览器环境(没有窗口,没有文档)@Vivin是的,在这种情况下可以赋值,但是它没有反映在参数x,y,z中,所以我只是觉得我遗漏了一些东西。还使用node.js检查了它,显示了相同的行为。不,那么我可以使用x,y,z参数列表。我想在函数开头的现有实现中加入一个对函数的调用,该函数只需将参数和一些默认值作为参数,例如默认值(参数,“string=nana”,“number=4”)
,因此指定实际参数的名称会以某种方式增加不必要的开销。感谢您的解释,这是可行的,但是,嗯,是的,这并不简单。我认为arguments对象在某种程度上被黑魔法绑定到参数,但它反映了当前传递的参数。所以现在我更清楚了。我不知道。
function argTest(x, y, z) {
x = typeof x !== 'undefined' ? x : ...;
y = typeof y !== 'undefined' ? y : ...;
// etc.
}
function argtest(x, y, z) {
defaults({
length: argtest.length,
get '0'() { return x; },
set '0'(val) { x = val; },
get '1'() { return y; },
set '1'(val) { y = val; },
get '2'() { return z; },
set '2'(val) { z = val; }
}, ...);
// ...
}