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
相关的引用错误。这没什么奇怪的
1eval(“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
相关的引用错误。这没什么奇怪的
1eval(“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
时,