代码之家  ›  专栏  ›  技术社区  ›  kolypto

JS_»-函数和“上上下文”变量

  •  2
  • kolypto  · 技术社区  · 14 年前

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

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

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

    当我使用这个动态创建的方法时,使用这种方法可能会面临哪些危险?我应该一直给这个吗 数据 作为争论还是可以?

    2 回复  |  直到 9 年前
        1
  •  3
  •   deceze    14 年前

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

    function outer() {
        var data = 1;
    
        ...
    
        someObject.method = function () {
            data = 42;
        };
    
        someObject.method();
        // data == 42
    }
    

    (真正的解释是当使用 数据 在内部函数中,javascript将尝试找出哪个范围 数据 是在。它将遍历范围链,找到创建变量的位置,这就是将要使用的变量。)

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

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

    function outer() {
        var data = 1;
    
        ...
    
        someObject.method = (function (data) {
            return function () {
                data = 42;
            }
        })(data);
    
        someObject.method();
        // data == 1
    }
    
        2
  •  3
  •   Jani Hartikainen    14 年前

    我真的想不出任何“危险”,除了可能导致循环引用,从而在DOM对象等情况下造成内存泄漏之外。

    它的工作方式与类中的私有变量非常相似。