【问题标题】:Console access to Javascript variables local to the $(document).ready function控制台访问 $(document).ready 函数本地的 Javascript 变量
【发布时间】:2012-11-25 19:48:20
【问题描述】:

如何访问里面的一些变量

$(document).ready(function(){
    var foo=0;
    var bar = 3;
});

来自 Google chrome 控制台?如果我尝试 alert(foo),我会收到一条消息,指出它没有定义。

【问题讨论】:

  • 在 $(document).ready( 之外定义它们,然后在内部也可以访问它们...
  • 你确定 jQuery 正在加载吗?
  • 出于安全原因,我不想在外面声明它们,我只是好奇如何或是否可以使用控制台访问它们 :)
  • @Vodaldrien:他们不能。

标签: javascript jquery console


【解决方案1】:

使用调试器设置断点。当调试器停止时,您将获得对它们的完全访问权限。

告诉您将它们放在全局范围内的其他答案很糟糕。不要因为您不知道如何使用正确的工具而使用不良做法。

【讨论】:

  • 您能否链接一些有关此的信息或我应该使用什么调试器?将不胜感激。我是 javascript/jquery 的新手,出于安全原因,我正在尝试检查是否可以以任何方式访问这些变量。谢谢
  • @Vodaldrien 使用 Firebug 或 Chrome 开发工具。使用您的代码的任何人可以访问这些变量。在任何情况下。不要认为您可以通过这种方式保护您的代码。一旦您将网页提供给客户,他就可以用它做任何他想做的事情。
  • @Vodaldrien 隐藏变量更多是为了避免错误并拥有更清晰的代码库:)
  • @RocketHazmat 用于 Chrome 开发工具,请查看 here。对于 Firebug,请查看其文档。
  • 这是正确答案!只需在您的 js 中的任何位置输入debugger。它可以在任何地方,包括定义,而不仅仅是程序调用..
【解决方案2】:

您无法访问这些变量,因为它们是在函数闭包中定义的。唯一可行的方法是在函数范围之外对它们进行全局引用。

var foo, bar;

$(document).ready(function(){
    foo = 0;
    bar = 3;
});

【讨论】:

  • 6 赞成建议使用全局变量的答案?真的吗?
  • 我不建议使用全局变量,只是它是这样做的唯一方法!
  • 不,不是。看我的回答。
  • 我认为 OP 理解闭包比如何使用调试工具更重要。
  • 冒着引发一场激烈战争的风险:“你能做到的唯一方法......”并不意味着建议,只是一个解决方案。语言上下文中的唯一解决方案是使用外部范围(例如,全局范围或其他命名空间)。但是,正如您所说,可以使用复杂的调试工具来解除此限制;但这超出了语言本身的规范。
【解决方案3】:

为什么不做一个适当的暴露变量?

$(document).ready(function(){
    var foo=0;
    var bar = 3;

    $.exposed = {
        foo: foo,
        bar: bar
    }
});

通过执行检查您的变量

console.log($.exposed.bar)

【讨论】:

  • 对调试超级有用!不错。
  • 这是一个好主意,更适合跨浏览器,虽然必须严格,不要忘记从这里删除它们或将其用作快捷方式,然后它变成另一个 window.variable 问题.否则,使用 debugger; 可能是最好的,因为它几乎会迫使您在部署之前将其删除。
【解决方案4】:

你不能,因为它们在封闭空间中。 Here 它解释了闭包的工作原理(How do JavaScript closures work?)。 要访问该变量,只需在 $(document).ready 函数内设置一个断点

【讨论】:

    【解决方案5】:

    如果您真的需要从代码的不同部分访问这些变量(例如,在准备好文档时对其进行初始化,然后在其他地方访问它们),那么您必须在函数闭包之外声明它们.

    当且仅当情况如此时,我才不喜欢弄乱全局空间。我建议您为此使用基础对象:

    var myObj = {};
    
    $(function() {
       myObj.foo = 0;
       myObj.bar = 3;
    });
    

    注意,它们只会在文档加载后设置!因此,紧跟在$(function() { ... }); 块之后的alert(myObj.foo);(或类似的东西)将产生undefined

    如果您只需要在该上下文中访问它们,那么不要在函数之外声明任何内容。并尝试使用其他方法调试您的代码。例如,对于 chrome,console.log 非常有用。

    【讨论】:

    • 变量的数量减半。这绝对比声明两个变量要好。
    • 如果变量foo 需要在别处被访问,那么你别无选择,只能在外部,在共享对象中声明它。这不是坏习惯,它一直在 JavaScript 代码中使用。有些人滥用它,但我的建议没有。
    • 但它不需要在其他地方声明......你甚至阅读过OP的问题吗?
    • "投票删除这篇文章" ? ...哇...我已经阅读了这个问题,但没有具体说明。尼尔,你的猜测和我一样多。
    • 不知道为什么这个答案被否决了。它基本上说与接受的答案相同,但只添加了一个全局对象而不是一堆随机全局变量。这绝对是“使其全球化”的最佳答案。
    【解决方案6】:
    $(document).ready(function(){
        window.foo=0;
        window.bar = 3;
    });
    

    你将这些变量暴露在全局范围内(真的不建议)

    【讨论】:

      【解决方案7】:

      在 $(document).ready() 之外定义它们,然后在内部也可以访问它们。

      var foo = 0, bar = 3;
      $(document).ready(function(){
          alert(foo);
      });
      

      【讨论】:

        【解决方案8】:

        实际上有一个 hackish 方法。您可能不应该使用它。设置断点。话虽如此,代码如下:

        $(document).ready(
            readyClosure = function(access){
                var x = 5; 
                return eval(access);
            }
        );
        readyClosure('x'); // returns 5
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-29
          • 1970-01-01
          • 2014-01-13
          • 2020-02-15
          • 1970-01-01
          • 2019-10-29
          • 2020-05-03
          • 1970-01-01
          相关资源
          最近更新 更多