JavaScript:属性描述符在传递给函数时被忽略

JavaScript:属性描述符在传递给函数时被忽略,javascript,arguments,descriptor,function-call,propertydescriptor,Javascript,Arguments,Descriptor,Function Call,Propertydescriptor,我想将getter/setter传递给函数,但不能。甚至可以在JS中做(或模仿)这样的事情吗 我试着用getter/setter调用一个函数,但它(很明显)不起作用,我试过“apply”和“call”,但它仍然(不知何故)不起作用 function foo(x, y) { var i; for (i = 0; i < 5; ++i) console.log(x, y); } var args = []; Object.defineProperties(args, {

我想将getter/setter传递给函数,但不能。甚至可以在JS中做(或模仿)这样的事情吗

我试着用getter/setter调用一个函数,但它(很明显)不起作用,我试过“apply”和“call”,但它仍然(不知何故)不起作用

function foo(x, y) {
  var i;

  for (i = 0; i < 5; ++i)
    console.log(x, y);
}

var args = [];

Object.defineProperties(args, {
  "0": {
    "set": function() { },
    "get": Math.random
  },

  "1": {
    "set": function() { },
    "get": function() { return new Date().getMilliseconds(); }
  }
});

foo.apply(this, args);
函数foo(x,y){ var i; 对于(i=0;i<5;++i) 控制台日志(x,y); } var args=[]; 对象。定义属性(参数{ "0": { “set”:函数(){}, “get”:Math.random }, "1": { “set”:函数(){}, “get”:函数(){returnnewdate().getmillizes();} } }); foo.apply(本,args);
预期有5个不同的结果,但得到了5个相同的结果。

问题在于
.apply
将“数组”转换为
参数
对象,因此您的访问器只会被评估一次

通过直接将数组传递给函数,可以使示例正常工作:

函数foo(arr){
对于(变量i=0;i<5;++i)
console.log(arr[0],arr[1]);
}
var args=[];
对象。定义属性(参数{
"0": {
“set”:函数(){},
“get”:Math.random
},
"1": {
“set”:函数(){},
“get”:函数(){returnnewdate().getmillizes();}
}
});

foo(args)不,这是不可能的。将
args
数组转换为
apply
中的单个值列表,然后将值本身作为参数传递

函数参数永远不会显示getter功能。有很多方法可以使特定作用域中的标识符充当getter/setter,但是您永远不应该这样做,而且无论如何都需要在函数内部这样做


您最好的选择是为
x
y
参数使用函数,并在
foo
中显式调用它们,我可能会有误解,但在我看来,当您通过
apply
方法将
args
传递给
foo
时,该程序将为
x
y
生成随机值-但一旦进入
foo
,这些参数将被固定,而
foo
只需打印出这些固定值5次。如果连续几次执行
foo.apply(null,args)
(这里
foo
中的循环是不相关的),那么我想每次都会得到不同的结果。顺便说一句,在ES6中,调用
foo(…args)
比使用
apply
yes更惯用,这或多或少就是我在评论中想说的。我还没有尝试过这段代码,还没有足够的信心将其转化为答案:)