【问题标题】:jquery - scope inside $(document).ready()?jquery - $(document).ready() 内的范围?
【发布时间】:2011-05-20 18:31:24
【问题描述】:

为了保持井井有条,我有几个 javascript 文件,尽管它们(最终)都被压缩在一起形成一个最终的 javascript 文件。

每个文件的内容都包含在:

$(document).ready(function(){
    //some javascript here
});

似乎如果我在单独的文件中(在该代码之间)有东西,它们就无法相互访问。这是范围问题吗?我能做什么?

例如,在一个文件中,我有一堆代码可以根据通过 ajax 接收的数据创建表。但是,文件的一半只是如何根据数据类型等显示数据的模板。我想将模板放在他们自己的文件中。

我知道这只是一个“偏好”问题,我可以将所有内容都放在一个文件中。

但我希望从中吸取教训,甚至能够以“我的”方式拥有它。

【问题讨论】:

    标签: jquery scope


    【解决方案1】:

    Javascript 使用函数作用域,因此函数内部的局部变量对外不可见。这就是为什么您的代码无法从其他范围访问代码的原因。

    理想的解决方案是创建一个命名空间

    var NS = {};
    
    (function(){
      function privateFunction() { ... }
      NS.publicFunction = function(){ ... }
    })();
    
    $(document).ready(function(){
      NS.publicFunction();
    });
    

    这也是一种有用的模式,因为它允许您区分私有元素和公共元素。

    【讨论】:

    • 请注意,如果您声明您的函数,例如privateFunctionAttempt = function() { /* do something */ },那么它实际上是在全局范围内。所以执行console.log(window.privateFunctionAttempt) 将显示您的函数,而不是像执行console.log(window.privateFunction) 时那样返回未定义。见stackoverflow.com/questions/11819425/…
    【解决方案2】:

    这是一个范围问题。例如:

    function a() {
       var myHiddenStr = 'abc';
    }
    alert(typeof(myHiddenStr));
    

    您无法在函数a 之外访问myHiddenStr。以类似的方式,您用于准备文档的匿名函数会隐藏其中的所有内容。

    拥有一个全局范围来放置来自不同 js 文件的内容并不是一个好主意。最好有一个 document.ready 处理程序并从其中调用相应的函数。然后,您可以从函数中获取结果并将它们传递给需要使用这些函数的其他函数。

    【讨论】:

      猜你喜欢
      • 2011-03-10
      • 2010-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-19
      • 2014-04-20
      • 1970-01-01
      • 2019-07-02
      相关资源
      最近更新 更多