JSλ-functions& “上层背景”变量

时间:2010-08-01 00:35:49

标签: javascript variables lambda

假设我有一些上下文,其中设置了变量并且调用了一个直接使用它们的λ函数:

function outerContext(){
    ...
    var data = ...; // some data the script uses
    ...
    someObject.method = function(){
        data; // the variable is used here
        };
    ...
    }

我知道动态创建的函数有一个创建它的上下文的快照,因此可以在那里访问data变量。

当我使用这种动态创建的方法时,这种方法可能面临的危险是什么?我应该总是把这个data作为一个论点,还是可以的?

2 个答案:

答案 0 :(得分:3)

除了可能导致循环引用以及因此在DOM对象等情况下发生内存泄漏之外,我无法真正想到任何“危险”。

它的作用很像一个类中的私有变量。

答案 1 :(得分:3)

内部函数无权访问“快照”,它可以完全访问data变量。

function outer() {
    var data = 1;

    ...

    someObject.method = function () {
        data = 42;
    };

    someObject.method();
    // data == 42
}

(真正的解释是,当在内部函数中使用data时,Javascript将尝试找出data所在的范围。它将遍历范围链以找到其中的位置变量已创建,这是将要使用的变量。)

没有“危险”,这是Javascript的核心竞争力之一。它就像一个修改对象属性的对象方法。当然你需要注意你想做什么,你真的想修改变量还是只想在本地使用它?

对于“快照”,您需要使用闭包:

function outer() {
    var data = 1;

    ...

    someObject.method = (function (data) {
        return function () {
            data = 42;
        }
    })(data);

    someObject.method();
    // data == 1
}