假设我有一些上下文,其中设置了变量并且调用了一个直接使用它们的λ函数:
function outerContext(){
...
var data = ...; // some data the script uses
...
someObject.method = function(){
data; // the variable is used here
};
...
}
我知道动态创建的函数有一个创建它的上下文的快照,因此可以在那里访问data
变量。
当我使用这种动态创建的方法时,这种方法可能面临的危险是什么?我应该总是把这个data
作为一个论点,还是可以的?
答案 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
}