Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/415.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaScript中删除闭包_Javascript_Closures - Fatal编程技术网

在JavaScript中删除闭包

在JavaScript中删除闭包,javascript,closures,Javascript,Closures,有没有办法在JavaScript中拆开闭包来确定函数是什么以及作用域是什么 或者,更简洁地说,是否有一种方法可以在JavaScript中序列化闭包 编辑 我想知道的是,是否给了我一个声明如下的函数: var o = {}; var f = function() { return o; } 有没有办法只看f就找到o?我不知道你说的“拆掉一个闭包”是什么意思。可以使用参数确定函数是什么。被调用方: 范围是什么 检查变量是否在范围内的唯一真正方法是尝试访问它。这意味着您需要使用try/catch语句

有没有办法在JavaScript中拆开闭包来确定函数是什么以及作用域是什么

或者,更简洁地说,是否有一种方法可以在JavaScript中序列化闭包

编辑

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

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

有没有办法只看f就找到o?

我不知道你说的“拆掉一个闭包”是什么意思。可以使用参数确定函数是什么。被调用方:

范围是什么

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

try{ myVar; alert("myVar is in scope"); }catch (e){ alert("myVar is not in scope"); }
实际上,如果您编写了代码,您已经知道哪些变量在范围内,如果您没有编写代码,您甚至可以通过检查代码来知道哪些变量在范围内

如果您试图获取堆栈,您可以(某种程度上)使用caller属性来实现这一点,但它是非标准的,可能在所有JS实现中都不可用*:

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


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

我不确定您所说的“拆掉一个闭包”是什么意思。可以使用参数确定函数是什么。被调用方:

范围是什么

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

try{ myVar; alert("myVar is in scope"); }catch (e){ alert("myVar is not in scope"); }
实际上,如果您编写了代码,您已经知道哪些变量在范围内,如果您没有编写代码,您甚至可以通过检查代码来知道哪些变量在范围内

如果您试图获取堆栈,您可以(某种程度上)使用caller属性来实现这一点,但它是非标准的,可能在所有JS实现中都不可用*:

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


*目前所有主要浏览器都支持Function.caller。另外,它似乎是在ECMAScript 3.1中定义的-您可以查看支持情况。

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

如果我理解正确(即使使用最新的编辑也很难说),答案是否定的。闭包的目的之一是封装变量,限制相关/依赖代码组的可访问性(在全局上下文之外分配),以尽量减少名称冲突和/或意外交互。如果要在全局上下文中访问
o
,则应在其中定义它。

是否有一种方法仅查看f并找到o?当然有:
f()
-虽然我想这不是您的想法。通常,函数体中的局部变量的行为类似于私有类成员,不可能从外部访问它们。包含在某个函数的闭包中不会改变这一点(除非函数返回这些变量,或以其他方式使其可访问)。有没有办法只看f而找到o?当然有:
f()
-虽然我想这不是你的想法。通常,函数体中的局部变量的行为类似于私有类成员,不可能从外部访问它们。包含在某个函数的闭包中不会改变这一点(除非函数返回这些变量或以其他方式使其可访问)。基本上,我在寻找一种方法,将闭包序列化为字符串,这样延续可以在页面刷新后继续存在。@MathGladiator这与闭包有什么关系?你所说的对我来说没有什么意义。基本上,我在寻找一种方法,将闭包序列化为字符串,这样延续可以在页面刷新后继续存在。@MathG拉迪亚特,这和闭包有什么关系?你说的对我来说没什么意义。
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(); } }