javascript - 寻找一些 js 范围 hack

标签 javascript scope

这里有一些您可能知道或可能不知道的 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/

相关文章:

JavaScript 变量作用域

Extjs View 别名/xtype 未在 Controller 中定义

C++ 链表在函数之间丢失数据

javascript - 更改回调函数名称

javascript - 您如何开发跨浏览器兼容性?

javascript - 从 jQuery Cycle 插件幻灯片中删除一个元素会破坏它

r - 应用系列功能的范围如何?

c# - 在这种情况下,R 和 C# 的作用域规则有何不同?

javascript - Lodash : return first key of object whose value(i. e 数组)中有一个给定的元素(即字符串)

javascript - 从 NG 绑定(bind)结果访问单个对象