在评估之前获取参数表达式

时间:2011-01-17 23:18:47

标签: javascript arguments eval expression

我正在尝试在Javascript中创建一个断言方法。我一直在与arguments.callee.caller和朋友们争吵了一段时间,但我找不到一种方法来可靠地获取调用函数的全文并找到该文本中称为当前函数的匹配项。

我希望能够像这样使用我的功能:

var four = 5;
function calculate4() { return 6; }

assert(4 == 2 + 3);
assert(4 == four);      
assert(4 == calculate4());
assert(4 != 3 && 2 < 1)

并获得如下输出:

断言4 == 2 + 3失败。 断言4 ==四次失败。 断言4 == calculate4()失败。 断言4!= 3&amp;&amp; 2

现在,我不能超越Assertion false failed.,这不是很有用......

我想避免传入额外的参数(例如this),因为我希望尽可能保持断言代码干净,因为它会被输入很多次。我真的不介意把它变成一个字符串,但我在尝试eval()那个字符串时担心范围问题。如果我没有其他选择,或者我的担忧没有根据,请说出来。

我在Windows上的.hta应用程序中运行它,所以它真的是jscript,我可以完全访问文件系统,ActiveX等。因此系统特定的解决方案很好(只要它们不需要Firebug等。 )。但是,我更喜欢一般解决方案。

3 个答案:

答案 0 :(得分:1)

没有可靠的方法可以做到这一点只传递一个参数。即使使用eval,使用的变量也将超出范围。如果arguments.caller只对arguments.caller进行一次调用,通过搜索并解析参数表达式,解析assert将起作用。不幸的是,您可以使用的专有工具都没有帮助。

答案 1 :(得分:0)

我最终使用了以下函数,这允许我可选地将断言的文本复制为第二个参数。这似乎最简单。

function assert(expression, message) 
{
    if (!expression) {
        if (message + "" != "undefined" && message + "" != "") {
            document.write("<h2>Assertion <pre>" +
                            message + 
                           "</pre> failed.</h2><br>");
        } else {
            document.write("<h2>Assertion failed.</h2><br>");
        }
    }
}

也许这有助于某人。可能有更好的方法,但这对我有用。

请注意,我只使用Javascript编程了三天,因此可能会进行一些改进。

答案 2 :(得分:0)

实际上,至少在浏览器和Node.js中是可能的。我不知道.hta申请。

现代浏览器,Node.js 并希望您的环境stack property放在包含堆栈跟踪的错误对象上。您可以构造新错误,然后解析包含assert()调用的文件的文件路径,以及调用的行号和列号(如果可用)。然后读取源文件,并在给定位置剪切assert表达式。

  1. 构建error
  2. 解析error.stack,获取filepathlineNumbercolumnNumber
  3. 阅读file
  4. 上的filepath
  5. lineNumber
  6. 中删除您想要的位columnNumberfile附近的位

    我写了一个名为yaba的断言函数,可能会让你继续。