Javascript Function.toString()不考虑闭包范围

Javascript Function.toString()不考虑闭包范围,javascript,node.js,Javascript,Node.js,为什么变量x没有在foo.toString()中记录为“bar”? foo的行为与其toString()值不匹配foo总是打印“bar”,但查看foo.toString()不会告诉您这一点 它与什么有关?如果决定不反编译函数以获取其toString()值,为什么不包括依赖于外部函数作用域的对象的解析 有没有办法使用旧的反编译方法来获取给定函数背后的实际代码?您正在执行匿名函数,因此返回值被分配给foo。如果你使用 var foo = (function(){ var x = "bar";

为什么变量
x
没有在
foo.toString()
中记录为
“bar”

foo
的行为与其toString()值不匹配
foo
总是打印“bar”,但查看
foo.toString()
不会告诉您这一点

它与什么有关?如果决定不反编译函数以获取其toString()值,为什么不包括依赖于外部函数作用域的对象的解析


有没有办法使用旧的反编译方法来获取给定函数背后的实际代码?

您正在执行匿名函数,因此返回值被分配给
foo
。如果你使用

var foo = (function(){
  var x = "bar";
  return function(){
    console.log(x);
  };
})();

console.log(foo.toString()); // function() {console.log(x);}

(foo)(); // 'bar'
eval('(' + foo.toString()+')()')); // error: x is undefined
foo.toString()
显示匿名函数和
foo().toString()
返回的函数

您的
eval
foo.toString()
1创建一个新函数,该函数与[创建
foo
]的匿名函数的]初始作用域的作用域没有任何关系,并执行该函数,因此它会导致与
x
相关的
引用错误。这没什么奇怪的


1
eval(“function(){console.log(x);}()”
您正在执行匿名函数,因此返回值被分配给
foo
。如果你使用

var foo = (function(){
  var x = "bar";
  return function(){
    console.log(x);
  };
})();

console.log(foo.toString()); // function() {console.log(x);}

(foo)(); // 'bar'
eval('(' + foo.toString()+')()')); // error: x is undefined
foo.toString()
显示匿名函数和
foo().toString()
返回的函数

您的
eval
foo.toString()
1创建一个新函数,该函数与[创建
foo
]的匿名函数的]初始作用域的作用域没有任何关系,并执行该函数,因此它会导致与
x
相关的
引用错误。这没什么奇怪的


1
eval(“function(){console.log(x);})()”

由于javascript是函数作用域,因此在转换为字符串时会丢失其作用域信息。因此,由该字符串创建的新函数与原始函数无关

我有两个变通办法:

首先,你可以像这样生活,而不是让食物成为一种生活:

var foo=function(){
var x=“bar”;
返回函数(){
控制台日志(x);
};

};因为javascript是函数作用域,所以当它转换为字符串时会丢失其作用域信息。因此,由该字符串创建的新函数与原始函数无关

我有两个变通办法:

首先,你可以像这样生活,而不是让食物成为一种生活:

var foo=function(){
var x=“bar”;
返回函数(){
控制台日志(x);
};

};“Function.toString()不考虑闭包范围”-它返回函数代码源的字符串表示形式,如您所见。
toString()
怎么能做呢?以字符串形式显示,字符串中的
x
实际放在哪里?声明后,
foo
是一个函数,它总是在控制台中打印“bar”。我希望它的toString()值是
console.log('bar')
,而不是
console.log(x)
,其中
x
是未定义的。如果希望x为常量,则只需在内部函数中直接使用字符串文字即可。在这个简单的示例中,x始终是“bar”,但它仍然是一个变量-很容易创建一个类似的示例,其中x的值可以在每次调用内部函数时更改。我认为期望toString()来判断变量是否真的是伪常量是不合理的。“Function.toString()不考虑闭包范围”-它返回函数代码源的字符串表示形式,如您所见。
toString()
怎么能做呢?以字符串形式显示,字符串中的
x
实际放在哪里?声明后,
foo
是一个函数,它总是在控制台中打印“bar”。我希望它的toString()值是
console.log('bar')
,而不是
console.log(x)
,其中
x
是未定义的。如果希望x为常量,则只需在内部函数中直接使用字符串文字即可。在这个简单的示例中,x始终是“bar”,但它仍然是一个变量-很容易创建一个类似的示例,其中x的值可以在每次调用内部函数时更改。我认为期望toString()来判断变量何时是或不是真的伪常量是不合理的。在您的示例中也存在同样的问题:
foo().toString()
导致
console.log(x)
,尽管它的实际定义更接近
console.log('bar')
。toString()值不反映
x
在父函数作用域中的事实。是的,
eval()
语句没有任何奇怪之处。我当然希望它创建一个新函数,而不引用
x
。这里困扰我的是
foo.toString()
的输出包含“x”而不是“bar”。创建
foo
时,
x
的值为“bar”。为什么生成的
toString()
输出
console.log(“bar”)
foo.toString()
只返回
foo
的字符串表示形式。它无法评估/确定/猜测
x
的性质。在您的示例中也存在同样的问题:
foo().toString()
导致
console.log(x)
,即使其实际定义更接近
console.log('bar')
。toString()值不反映
x
在父函数作用域中的事实。是的,
eval()
语句没有任何奇怪之处。我当然希望它创建一个新函数,而不引用
x
。这里困扰我的是
foo.toString()
的输出包含“x”而不是“bar”。创建
foo
时,