【问题标题】:How can get a list of the functions in a javascript file?如何获取 javascript 文件中的函数列表?
【发布时间】:2011-01-25 23:29:47
【问题描述】:

我正在尝试为 javascript 拼凑一个 php 样式的包含函数。我采取的路线是通过 XMLHttpRequest。包含的文件将加载,但该文件中的函数不可用,因为它们的范围仅限于调用它们的函数。

我遇到了this article,它实现了类似的目标,但需要编码人员提前指定他们需要哪些功能,而我想简单地包含一个文件并自动将这些功能添加到窗口对象中。

这是我的进步

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 属性或函数我可以访问以获取文件中的函数列表?

【问题讨论】:

标签: javascript xmlhttprequest include


【解决方案1】:

OrbMan 为我指出了正确的方向,但是这种包含 Javascript 文件的特定方法的解决方案需要对函数进行不同的定义;像这样

window.myFunction = function(){ 

    alert("Hey There!") 

}

这样做的一个潜在好处是,包含文件中以正常方式声明的任何函数都被封装,因此它们仅可用于该文件中的 window.functions ......据我所知。

【讨论】:

    【解决方案2】:

    使用DOM添加所需的脚本很简单:

    function include(jsFile)
    {
        var sEl  = document.createElement("script");
        sEl.type = "text/javascript";
        sEl.src  = jsFile;
        document.getElementsByTagName("head").appendChild(sEl);
    }
    

    浏览器甚至会异步下载这个文件,并且脚本元素有一个onload 事件,该事件适用于大多数(所有?)流行浏览器,因此您还可以根据需要添加回调函数。明显的缺点是,在文件下载和解析之前,当前脚本无法使用函数。

    【讨论】:

    • 如果 onload 给您带来问题,请在每个脚本的末尾附加一个调用一些自定义 onload 处理程序的函数,即:scriptFinishedLoading('nameofThisScriptFile.js');
    • 我在另一条评论中提到了这一点......但我不喜欢这种方法。这可能是不合理的。但无论如何,OrbMan 的回答让我走上了正轨,所以问题解决了。
    • @gargantaun:对我来说,将包含文件中的源更改为对每个全局声明的函数使用 window.funcName = function () {} 似乎更不合理。
    • @Andy:对不起,我在这里重复了两个答案......但你是对的,在大多数情况下我的方式可能是错误的方式,但对于我的项目'm working on,这是一个 Javascript 对象库,这个方法提供了一个方便的视觉线索,让我知道我正在处理什么类型的文件,而 javascript 通常缺乏这种文件。最重要的是,我现在知道可以这样做的。是否取得了最好的结果是另一个讨论。
    • @gargantaun:如果你这样做,我会研究命名空间。这涉及在主文件中创建一个全局对象变量,并且包含的​​文件在评估时将类、方法和属性添加到该命名空间。这和window.funcName = function () {} 差不多,你只是在使用自己的命名空间,而不是污染window 对象。
    【解决方案3】:

    改变你声明你的函数的方式,它应该可以解决范围问题。而不是:

    function add(a, b) 
    {                     
        return a + b;
    } 
    

    这样做:

    var add = function(a, b) 
    {                     
        return a + b;
    }   
    

    【讨论】:

    • 关闭!我选择了 window.includedFunc = function(){ ... },它完美地解决了这个问题。
    • @gargantaun:您应该将其发布为答案
    • 如果您将其添加到您的答案中,我可以接受。 (接受稍微正确的答案是失礼吗?)
    • @gargantaun:唯一的缺点是所有全局函数都必须以这种方式声明。仅仅因为您“不喜欢” DOM 方法就这样做似乎很愚蠢,该方法无需更改所需文件即可正常工作。
    • @josh:每当我不得不回答自己的问题时,我都会感到很糟糕,尤其是在刚刚问完之后。如果 OrbMan 没有编辑他的答案,你可以接受。
    【解决方案4】:

    与其通过 AJAX 加载 JavaScript 文件,不如创建一个 <script> 标记并将其插入到页面中?这将允许在全局范围内解析 JavaScript。看看 Scriptaculous 的 require 函数是如何工作的

    【讨论】:

    • 出于某种原因,我真的不喜欢这种方法。我不知道为什么,这完全是我个人的喜好,但这种方式对我来说感觉更整洁。
    猜你喜欢
    • 2013-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    • 2016-09-03
    • 1970-01-01
    相关资源
    最近更新 更多