23

假设我有这个匿名函数:

(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从外部访问,让代码保持原样?

4

5 回答 5

14

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

不,没有黑客可用于访问变量,例如private无需重写代码。

在函数内定义的变量var只能从该函数内访问。

于 2013-01-17T06:45:44.520 回答
10

好的。我知道了。

(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

于 2013-01-17T07:02:18.100 回答
2

它们不打算作为“私有”变量;这就是闭包的工作方式。至少,你可以在 Perl 和 Python 中做同样的事情,可能还有很多其他带有闭包和词法作用域的语言。

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

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

于 2013-01-17T07:12:27.483 回答
0

这就是拥有范围和私有变量的全部意义所在

任何一个

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

或者

在外面声明变量

于 2013-01-17T06:50:54.303 回答
-3

你必须做这样的事情:

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'
于 2013-01-17T06:49:36.033 回答