【问题标题】:Data Access JS functions数据访问 JS 函数
【发布时间】:2012-06-10 22:56:50
【问题描述】:

我有几个 Js 函数,比如 fn1()fn2()。 页面加载时会自动调用fn1()

<script >

window.onload=fn1();

 function fn1()
 {
  var list_temp=new Array();
  list_temp.push("testing");
  //etc
 }

 function fn2()
 {
   // Do something after getting the data from fn1()
 }
 </script>`

现在我需要从fn2() 访问fn1() 中定义的列表。有什么办法可以做到吗?我记得在某处读过 Javascript 中的函数在某种程度上等同于对象?

【问题讨论】:

  • 仅供参考 window.onload=fn1() 是说将 window.onload 的值设置为 fn1() 返回的值;相反,您需要 window.onload=fn1 或调用 fn1 window.onload=function(){fn1();} 的匿名函数。
  • 有趣,谢谢@Snuffleupagus

标签: javascript html dom-events javascript-framework


【解决方案1】:

您可以在全局范围内定义一个变量,但您也可以将您的两个函数包装在 closure 中,并将变量设为该闭包的私有(本地):

(function() {
   var list_temp = [];
   window.onload = fn1;

   function fn1()
   {
       list_temp.push("testing");
       // etc...
   }

   function fn2()
   {
       console && console.log(list_temp);
       // Do something after getting the data from fn1()...
   }
})();

【讨论】:

    【解决方案2】:

    简单声明

    var list_temp=new Array();
    

    之前

    function fn1 ()
    

    同级

    window.onload
    

    在顶级脚本中声明的变量是全局变量... 在 JS var scope 中是函数 ...

    【讨论】:

    • 当然!谢谢你。只是出于好奇,是否可以从另一个 声明中获取声明的数据?
    • 是的,如果它在您要使用 var 的位置之前加载!
    • 每个脚本都在同一个 global 范围内执行,所以是的。
    【解决方案3】:

    window.onload=fn1();

    页面加载时不会运行fn1。它运行fn1立即并将其返回值分配给window.onload。和x = foo();一模一样。

    现在我需要从 fn2() 访问 fn1() 中定义的列表。有什么办法可以吗?

    不,不符合定义。 list_tempfn1 中的本地人。除非你把它放在fn2 可以访问它的地方(一些共享范围),否则fn2 不能访问它。

    这是一个共享范围的示例(并修复了 window.onload 事物):

    (function() {
        var list_temp=new Array(); // Or better, var list_temp = [];
    
        window.onload=fn1; // No () at end
    
        function fn1()
        {
            list_temp.push("testing");
            //etc
        }
    
        function fn2()
        {
            // Do something after getting the data from fn1()
        }
    })();
    

    或者,当然,您可以将list_temp 设为全局。但这通常不是一个好主意。

    【讨论】:

    • javascript 中的全局变量有什么不好?
    • @Wex,模块化。现在的 Javascript 都是关于混合模块的(只要看看这里所有的 jQuery 冲突问题),所以尽可能多地封装是有意义的。
    • @Wex:在计算机科学中,全局变量通常是一种众所周知的反模式。但特别是在浏览器中,全局命名空间难以置信地拥挤。假设您有一个divid "foo",并且完全分开,您有一个名为foo 的全局变量。猜猜看:它们相互冲突,因为所有id 值都被转储到全局命名空间中(作为指向具有id 的元素的属性)。
    【解决方案4】:

    您可以将这些功能链接在一起:

    function fn1()
    {
     var list_temp=new Array();
     list_temp.push("testing");
     //etc
     fn2(list_temp);
    }
    
    function fn2(data)
    {
      // Do something after getting the data from fn1()
    }
    

    【讨论】:

      【解决方案5】:

      我记得在某处读到 javascript 中的函数在某种程度上等同于对象?

      是的,所有函数都是对象,继承自一个通用的 Function 原型。您可以像在所有对象上一样在它们上设置自己的属性,但这对我们没有帮助。

      现在我需要从 fn2() 访问 fn1() 中定义的列表

      你不能。 list_temp 的变量声明的作用域是函数,它不能从外部获得。所以你也可以

      • 将变量声明移动到 fn2 可见的范围内
      • 将列表对象导出到 fn2 可见的其他变量。例如,最简单的方法是使用 return 语句。

      【讨论】:

        猜你喜欢
        • 2018-03-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-29
        • 1970-01-01
        • 2014-09-05
        • 2015-10-12
        • 1970-01-01
        相关资源
        最近更新 更多