【问题标题】:JavaScript: access variables inside anonymous function from the outsideJavaScript:从外部访问匿名函数内部的变量
【发布时间】:2012-12-31 15:52:10
【问题描述】:

假设我有这个匿名函数:

(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,让代码保持原样?

【问题讨论】:

  • 不改代码就不行。
  • 私有变量是私有的……为什么要从外部访问私有变量?
  • @rexcfnghk - 没那么多。这是“那只是因为它是这样工作的”的那些时刻之一
  • 为什么你需要这样做?只是为了好玩?
  • @Damask - 人们可能想知道是否可以做某事,以防止错误地假设它无法完成。

标签: javascript scope anonymous-function


【解决方案1】:

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

不,没有黑客可以访问变量,例如 private 而无需重新编写代码。

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

【讨论】:

    【解决方案2】:

    你必须这样做:

    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'
    

    【讨论】:

      【解决方案3】:

      这就是拥有作用域和私有变量的全部意义

      要么

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

      或

      在外面声明变量

      【讨论】:

        【解决方案4】:

        好的。我明白了。

        (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获取'private msg'

        【讨论】:

        • 聪明。只是,您无法更改 private 的值,因此您拥有的是只读“访问权限”。
        【解决方案5】:

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

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

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

        【讨论】:

        • 闭包 == 匿名函数吗?
        • @barjonah - 它们相关但不相同。使用匿名函数的声明很容易形成闭包。当匿名(甚至是嵌套或常规命名函数)引用其父范围内的变量时,就会形成闭包。所以匿名函数是创建闭包的一种方式。
        • 我忍不住觉得我已经answered this before :) 但 Faiz 是正确的,是的。
        猜你喜欢
        • 2013-08-16
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-28
        • 2011-10-29
        相关资源
        最近更新 更多