JavaScript:从外部访问匿名函数内的变量

时间:2013-01-17 06:41:36

标签: javascript scope anonymous-function

说我有这个匿名功能:

(function(window){

 var private = 'private msg';

 function sayit() {
   alert(private) // works
 }

 document.body.onclick = sayit; // works

})(window);

// private shouldn't be accessible here

这是JavaScript应该如何表现的吗?

也就是说,无法从该匿名函数之外的任何地方访问private

如果是这样,是否有可能从外部找到某种黑客访问private,让代码保持原样?

5 个答案:

答案 0 :(得分:11)

是的,这就是Javascript让你拥有'私有'变量(隐藏在函数范围内)的方式。

不,没有hack可用于访问private等变量而无需重写代码。

函数中使用var定义的变量只能从该函数中访问。

答案 1 :(得分:8)

确定。我懂了。

(function(window){
    var alert_original = window.alert;
    window.alert = function(data) {
        window.extracted = data;
        alert_original(data);
    };
})(window);

(function(window){
    var private = 'private msg';
    function sayit() {
    alert(private) // works
 }
 document.body.onclick = sayit; // works
})(window);

点击正文后,您可以从extracted

获取“私信”

答案 2 :(得分:2)

它们不是“私人”变量;这就是闭包的工作原理。您可以在Perl和Python中执行相同的操作,至少可以使用闭包和词法范围等许多其他语言。

像Firebug或Chrome Inspector这样的调试器仍然可以在任何时候显示整个堆栈(包括已关闭的变量),但除此之外并且不更改原始代码,我认为你运气不好。

也许如果你告诉我们你的实际问题......:)

答案 3 :(得分:0)

这就是拥有范围和私有变量的重点

无论

将私有值设置为全局变量?

之外声明变量

答案 4 :(得分:-1)

你必须做这样的事情:

var Test = (function(window){
 var private = 'private msg';
 var api = {};

 function sayit(){
   alert(private) // works
 }
 document.body.onclick = sayit; // works

api.sayit = sayit;
return api;
})(window);

Test.sayit(); //this would alert 'private msg'