这里有一些您可能知道或可能不知道的 javascript 函数参数变量的有趣行为:
function foo(bar) {
console.log('bar was:', bar);
arguments[0] = 'zap';
console.log('bar now:', bar);
}
foo('bam');
// bar was: bam
// bar now: zap
如您所见,bar
变量现在指向另一个值。
我想以一种稍微奇怪的方式利用这种行为,我想知道是否有可能以某种方式从函数范围外部更改参数值?
也许使用 call/apply,或者其他一些 trycky js 功能?
所以我可以在调用函数参数后更改它的值,例如:
function chooseNumber(number) {
setInterval(function() {
console.log('I choosed:', number)
}, 1000)
}
chooseNumber(1);
// I choosed: 1
// I choosed: 1
// I choosed: 1
// ...
然后如果我决定改变主意,我怎样才能使初始函数输出:
// I choosed: 2
// I choosed: 2
// I choosed: 2
// ...
最佳答案
不,这是不可能的,尤其是在 EcmaScript 5 严格模式下。然而 hackery 可以在非严格模式下成功。以下尝试通过存储的 arguments
对象修改闭包中的参数;适用于 Firefox。
var argsave, bar;
(function foo(a) {
argsave = arguments;
bar = function () {
alert("a is now: " + a);
};
} (13));
bar(); // --> a is 13
argsave[0] = 42;
bar(); // --> a is 42
但是你不需要它,也不应该使用它;如果你想在闭包中修改一个值,那么在闭包中使用一个函数:
var setA, bar;
(function foo(a) {
bar = function () {
alert("a is now: " + a);
};
setA = function (newA) {
a = newA;
};
} (13));
bar(); // --> a is 13
setA(42);
bar(); // --> a is 42
关于javascript - 寻找一些 js 范围 hack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18290276/