Javascript 有没有一种聪明的方法可以访问包装函数中的变量?

Javascript 有没有一种聪明的方法可以访问包装函数中的变量?,javascript,Javascript,是否有任何方法可以获取、访问或最终访问console.log u 是否有任何代码我可以放在x中,使你容易受到攻击/从外部可以访问 编辑:我的意思是不直接返回u。有没有办法不小心把你暴露出来?简短回答:没有。Private是Private是Private 稍长一点的回答:Javascript不能防止构思或执行不当的编码、意外丢失var或返回或设置对象中的属性访问器(this.u=1;)(或访问子范围中的变量*)或弱咖啡 如果正确使用并理解,则必须出于某种目的公开作用域内的局部/私有变量。如果有魔法

是否有任何方法可以获取、访问或最终访问console.log u

是否有任何代码我可以放在x中,使你容易受到攻击/从外部可以访问


编辑:我的意思是不直接返回u。有没有办法不小心把你暴露出来?

简短回答:没有。Private是Private是Private

稍长一点的回答:Javascript不能防止构思或执行不当的编码、意外丢失
var
或返回或设置对象中的属性访问器(
this.u=1;
)(或访问子范围中的变量*)或弱咖啡

如果正确使用并理解,则必须出于某种目的公开作用域内的局部/私有变量。如果有魔法巫毒可以暴露你宝贵的变量,我还没有看到它。(没有证据证明或否定雪人是否在地球上活动?!)

这包括但不限于:

  • 劫掠外星人
  • 吐温麦莉塞勒斯
  • 教皇(小心忏悔,嘴唇松弛…)
  • 胖艾伯特
  • 茶话会
  • 奥斯汀·鲍尔的猫
  • 虚无主义者
  • 驼背
  • 小犀牛
  • 埃尔耶蒂,不,嘿
等等,等等


*草地上的枪手?

不,不可能。执行函数后,没有剩余变量引用
u
的值。因此,
u
的值将被垃圾收集并丢失。

我讨厌术语“private”,因为它推断内容是不可查看的

var x=(function(){var u=1;})();

console.log(x.u); // undefined

x=(函数(){var u=1;})();
myvar=document.getElementById(“MyScript”).innerText;
文件编写(myvar);
u被销毁(如中所述,不会泄漏内存),但源代码不存在,并且可以查看,尽管用javascript解析javascript很痛苦

<script id="MyScript">
x=(function(){var u=1;})();
</script>
<script>
myvar = document.getElementById("MyScript").innerText;
document.write(myvar);
</script>

是的,您可以通过将其附加到函数本身来公开它:

(function() {
  var bar = {};
  bar.u = Number(0);
  var x = (function(foo){
    var u = foo.u = (function(n) { return !foo.n ? n : foo.n }(1)) ;
  })(bar);

console.log(bar.u, x, typeof x);
}());

console.log(x, u, window.bar, window.foo);
小提琴:


我可以看出这对调试很有用,但如果你不小心的话,它也有可能引入非常顽固的bug。

我认为没有,但这有什么必要。谁会在第一个问题上贬低某人??(我从来没有说过“我使用”或“用于”!)如果你没有注意到,
x
是未定义的。如果您想访问外部的值,请将其设置为global@8Dk我建议您阅读并学习本手册的OOP部分。从代码中可以很容易地看出它充满了错误。也许,您可能试图在JS中模拟OOP。它将被垃圾收集,但何时发生将是未知的。@JaredFarrish是的,它是未知的,但它将发生的事实证明您无法再访问
u
的值,因为您访问它所做的任何操作都将导致未定义的行为,因为这个值可能已经被垃圾收集了,也可能没有。@JaredFarrish你的观点是什么?只要保留对该值的引用,它就不会得到垃圾回收=>没有未定义的行为。如果没有剩余的引用,则可以随时收集该值,因此它可能仍然存在,也可能不存在=>未定义的行为。这将被视为故意的(如果是故意的)或因面部植物错误而绊倒。更新为本地对象
。感谢不是本地对象,而是全局变量,例如
window.bar
(或者在更高的范围内)。同样的情况下,你传递变量,因此故意访问你设置的值两次,其中一次是非局部的。这比演示更令人困惑。不确定评论到底是什么意思?请照亮。谢谢,
self
/
窗口的例子更聪明。花了一两分钟才弄清楚你在那里干什么<代码>;)
var u=Math.random();打印出来@那将超出我的能力范围。
var fn = function(){
    this.u = "Secret value!";
    return "Public value";
}
var x = fn.bind(fn)();

$('#returned').text(x);
$('#result').text(fn.u);