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

在javascript中关闭

  •  1
  • MathGladiator  · 技术社区  · 15 年前

    有没有一种方法可以在javascript中删除一个闭包来确定函数是什么,作用域是什么?

    或者,更简洁地说,有没有一种方法可以序列化JavaScript中的闭包?

    编辑

    我想知道的是,如果给我一个函数声明如下:

    var o = {};
    var f = function() { return o; }
    

    有没有办法只看F找到O?

    2 回复  |  直到 15 年前
        1
  •  1
  •   Josh Stodola    15 年前

    如果我正确理解你(很难说,即使有你最新的编辑),答案是否定的。闭包的目的之一是封装变量,限制对相关/相关代码组的访问(分配给 由于 全局上下文),以尽量减少名称冲突和/或意外交互。如果您想访问 o 在全局上下文中,您应该在那里定义它。

        2
  •  3
  •   Andy E    15 年前

    我不知道你所说的“拆封”是什么意思。确定功能可以使用 arguments.calele参数 :

    function test () { console.log(arguments.callee); }
    // -> function test () { console.log(arguments.callee); }
    

    范围是什么?

    检查变量是否在作用域中的唯一真正方法是尝试访问它。这意味着您需要使用try/catch语句,因为如果引用未声明的变量,则会引发错误:

    try{ myVar; alert("myVar is in scope"); }catch (e){ alert("myVar is not in scope"); }
    

    实际上,如果编写代码,您就已经知道哪些变量在作用域中,如果不编写代码,甚至可以通过检查代码来知道。

    如果您试图获取堆栈,可以使用 呼叫者 财产 但是它是非标准的,可能在所有JS实现中都不可用。 * :

    function getStack () {
        var stack = [], cFunc = arguments.callee;
        while (cFunc = cFunc.caller)
            stack.push(cFunc);
    
        console.dir(stack);
    }
    
    function func1 () { func2(); }
    function func2 () { try { obviousError(); } catch (e) { getStack(); } }
    

    大多数内置的开发人员工具以更清晰的方式为您提供堆栈(IE7和IE8没有),因此最好在可能的情况下使用它们。

    *目前所有主要浏览器都支持function.caller。它也似乎是在ecmascript 3.1中定义的-您可以检查支持 here .