数据访问 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_temp
是 fn1
中的本地人。除非你把它放在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:在计算机科学中,全局变量通常是一种众所周知的反模式。但特别是在浏览器中,全局命名空间难以置信地拥挤。假设您有一个div
和id
"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
的变量声明的作用域是函数,它不能从外部获得。所以你也可以
return
语句。
【讨论】:
以上是关于数据访问 JS 函数的主要内容,如果未能解决你的问题,请参考以下文章
在回调函数之外访问由 node.js 中的 readline 和 fs 解析的数据