数据访问 JS 函数

Posted

技术标签:

【中文标题】数据访问 JS 函数【英文标题】:Data Access JS functions 【发布时间】: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 【参考方案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 语句。

【讨论】:

以上是关于数据访问 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章

无法访问节点js中函数外部的响应对象数据

在回调函数之外访问由 node.js 中的 readline 和 fs 解析的数据

在 Ajax 函数中访问 Vue.js 组件属性

JavaScript/node.js:尝试访问某个函数之外的对象属性时获取 NULL

准备好使用 Vue.js 访问子组件中的 api 数据

vue js 2:在挂载函数中访问道具