如何在javascript文件中获取函数列表?
我正在尝试拼凑一个php风格的javascript包含函数。我所走的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数 我遇到了一个实现类似目标的方法,但是需要程序员事先指定他们需要的函数,而我只想包含一个文件并自动将函数添加到窗口对象中 这是我的进步如何在javascript文件中获取函数列表?,javascript,xmlhttprequest,include,Javascript,Xmlhttprequest,Include,我正在尝试拼凑一个php风格的javascript包含函数。我所走的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数 我遇到了一个实现类似目标的方法,但是需要程序员事先指定他们需要的函数,而我只想包含一个文件并自动将函数添加到窗口对象中 这是我的进步 function twinkle(){ getXMLHTTPObj("twinkle/test.js"); // A simple function insi
function twinkle(){
getXMLHTTPObj("twinkle/test.js");
// A simple function inside test.js
includedFunc();
}
// XMLHttp Stuff lifted from he Apple tutorial
var req;
function getXMLHTTPObj(url) {
req = false;
// branch for native XMLHttpRequest object
if(window.XMLHttpRequest && !(window.ActiveXObject)) {
try {
req = new XMLHttpRequest();
} catch(e) {
req = false;
}
// branch for IE/Windows ActiveX version
} else if(window.ActiveXObject) {
try {
req = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
try {
req = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
req = false;
}
}
}
if(req) {
req.onreadystatechange = processReqChange;
// Set to False so javascript waits for the included functions
// to become available
req.open("GET", url, false);
req.send("");
}
return req;
}
function processReqChange() {
// only if req shows "loaded"
if (req.readyState == 4) {
// only if "OK"
if (req.status == 200) {
eval(req.responseText);
} else {
alert("There was a problem retrieving the XML data:\n" +
req.statusText);
}
}
}
我正在考虑在每个包含的文件中创建一个函数索引,在包含该文件时可以对其进行迭代,但这并不是一个很好的解决方案
有什么想法吗?是否有一些javascript属性或函数可以访问以获取文件中的函数列表?与其通过AJAX加载javascript文件,为什么不创建一个
标记并将其插入页面?这将允许在全局范围内解析JavaScript。看看Scriptaculous'require
函数是如何工作的更改您声明函数的方式,它应该可以解决范围问题。而不是:
function add(a, b)
{
return a + b;
}
这样做:
var add = function(a, b)
{
return a + b;
}
使用DOM添加所需脚本非常简单:
function include(jsFile)
{
var sEl = document.createElement("script");
sEl.type = "text/javascript";
sEl.src = jsFile;
document.getElementsByTagName("head").appendChild(sEl);
}
浏览器甚至会异步下载这个文件,脚本元素有一个
onload
事件,在大多数(所有?)流行的浏览器中都可以使用,因此如果您愿意,还可以添加回调函数。明显的缺点是,在下载并解析文件之前,当前脚本无法使用函数。OrbMan为我指出了正确的方向,但包含Javascript文件的特定方法的解决方案要求函数的定义不同;像这样
window.myFunction = function(){
alert("Hey There!")
}
这样做的一个潜在好处是,包含文件中以正常方式声明的任何函数都被封装,因此它们仅对window可用。该文件中的函数。。。据我所知 出于某种原因,我真的不喜欢这种方法。我不知道为什么,这完全是我个人的喜好,但这种方式让我感觉更整洁。接近!我选择了window.includedFunc=function(){…},它完美地解决了这个问题。@gargantaun:你应该把它作为一个答案,如果你把它添加到你的答案中,我可以接受。(接受稍微正确的答案是失礼的吗?@gargantaun:唯一的缺点是所有全局函数都必须以这种方式声明。仅仅因为您“不喜欢”DOM方法而这样做似乎很愚蠢,因为它可以在不必更改所需文件的情况下正常工作。@josh:每当我必须回答自己的问题时,我都会感到很难过,尤其是在刚刚问完问题之后这么快。如果OrbMan没有编辑他的答案,你可以接受。如果onload给你带来问题,在每个脚本的末尾附加一个函数,调用一些自定义onload处理程序,即:
scriptfinishedload('nameofthisscript file.js')代码>我在另一条评论中提到了这一点。。。但这种方法有一点我不喜欢。这可能是不合理的。但OrbMan的回答让我走上了正确的轨道,所以问题解决了。@gargantaun:对我来说,将包含文件中的源代码更改为对每个全局声明的函数使用window.funcName=function(){}
。@Andy:对不起,我在这里重复了两个答案。。。但是你是对的,在大多数情况下,我的方法可能是错误的,但是对于我正在处理的项目,这是一个Javascript对象库,这个方法提供了一个方便的视觉线索,告诉我正在处理什么类型的文件,而Javascript通常缺乏这种类型的文件。最重要的是,我现在知道这样做是可能的。“它到底是好是坏,这是另一个讨论。”@gargantaun:如果你这样做的话,我会研究名称空间。这涉及到在主文件中创建一个全局对象变量,所包含的文件在计算类、方法和属性时会将它们添加到该名称空间中。这与执行window.funcName=function(){}
几乎相同,您只是使用自己的名称空间,而不是污染window
对象。这个问题(我最近问的问题)似乎是重复的,有两个很好的答案: