Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/408.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在javascript文件中获取函数列表?_Javascript_Xmlhttprequest_Include - Fatal编程技术网

如何在javascript文件中获取函数列表?

如何在javascript文件中获取函数列表?,javascript,xmlhttprequest,include,Javascript,Xmlhttprequest,Include,我正在尝试拼凑一个php风格的javascript包含函数。我所走的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数 我遇到了一个实现类似目标的方法,但是需要程序员事先指定他们需要的函数,而我只想包含一个文件并自动将函数添加到窗口对象中 这是我的进步 function twinkle(){ getXMLHTTPObj("twinkle/test.js"); // A simple function insi

我正在尝试拼凑一个php风格的javascript包含函数。我所走的路线是通过XMLHttpRequest。将加载包含的文件,但该文件中的函数不可用,因为它们的作用域仅限于调用它们的函数

我遇到了一个实现类似目标的方法,但是需要程序员事先指定他们需要的函数,而我只想包含一个文件并自动将函数添加到窗口对象中

这是我的进步

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
对象。这个问题(我最近问的问题)似乎是重复的,有两个很好的答案: