gpt4 book ai didi

javascript - Function.toString() 不尊重闭包范围

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:46 25 4
gpt4 key购买 nike

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() 中的 var x 没有记录为 "bar"

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

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

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

最佳答案

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

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

foo.toString() 显示匿名函数和
foo().toString()返回函数

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

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

关于javascript - Function.toString() 不尊重闭包范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15061363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com