有没有一种聪明的方法来访问包装函数内的变量?

时间:2014-06-29 12:19:01

标签: javascript

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

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

是否有任何方法可以获取,访问或最终控制台.log u?

我可以在x中放入任何可能使你从外部易受攻击/可访问的代码吗?

编辑:我的意思是不“直接”回复你。有没有办法偶然暴露你?

5 个答案:

答案 0 :(得分:6)

简答:不。私人是私人的。

稍微长一点回答: Javascript无法防止错误构思或执行编码,意外遗漏var或在对象中返回或设置属性访问者(this.u = 1;) (或访问子视图中的变量*)或弱咖啡。

如果正确使用并且理解正确,则必须在某种范围内公开范围内的本地/私有变量。如果有一些魔法巫毒可以暴露你的宝贵变量,我还没有看到它。 (没有证据证明或反驳雪人是否偷偷摸摸地球?!?

这包括但不限于:

  • 劫掠外星人
  • Twerking Miley Cyrus
  • 教皇(小心忏悔,松散的嘴唇......)
  • Fat Albert
  • 茶话会
  • Austin Power的猫
  • 虚无主义
  • Moops
  • 小犀牛
  • El Yeti,née,Hefe

等等,等等。

*枪手上的枪手?

答案 1 :(得分:1)

不,没有办法。执行该函数后,没有剩下的变量,它引用了u的值。因此,u的值将被垃圾收集并丢失。

答案 2 :(得分:1)

我讨厌“私人"因为它推断内容受到保护而无法查看。

<script id="MyScript">
x=(function(){var u=1;})();
</script>
<script>
myvar = document.getElementById("MyScript").innerText;
document.write(myvar);
</script>
你被破坏了(因为没有泄漏内存),但是源代码不是并且可以查看,尽管使用javascript解析javascript很痛苦。

答案 3 :(得分:1)

(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);

jsfiddle http://jsfiddle.net/guest271314/9qqpA/

答案 4 :(得分:0)

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

var fn = function(){
    this.u = "Secret value!";
    return "Public value";
}
var x = fn.bind(fn)();

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

小提琴:http://jsfiddle.net/b29Xg/1/

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