奇怪的JavaScript函数绑定。这个控制流程是否正确?

时间:2012-04-21 22:29:50

标签: javascript

我在同一个.js文件中有以下函数定义(称之为A.js)

function PParser() {
....
makeExpression = function (lexemes, index) {

    return makeNumber(lexemes, index);
}

makeDeclaration = function(lexemes, index)
{
    if (lexemes[index].TokenType != LALLPLexer.VAR) {
        throw "Expected VAR at index " + index;
    }

    if (lexemes[index + 1].TokenType != LALLPLexer.ID) {
        throw "Expected ID at index " + index + 1;
    }

    if (lexemes[index + 2].TokenType != LALLPLexer.ASSIGN) {
        throw "Expected ASSIGN at index " + index + 2;
    }

    var expressionNodeResult = makeExpression(lexemes, index + 3);

...

当达到“makeExpression”调用时,我期待控制流移动到上面定义的函数。但是,另一个名为“makeExpression”的函数在完全不同的.js文件(B.js)中调用。

 function Controller()
{
...

this.parseToStatement = function(statementText)
{
    makeExpression = function(expressionNode)
    {
        return new IntLiteral(expressionNode.Content);
    }

    try {
        statement = parser.parseStatement(new LALLPLexer().lex(statementText));

        if (statement.NodeType == LALLPParser.DECLARATION) {

            return new Declaration(statement.Id, makeExpression(statement.Expression));
        }
    }
    catch (exception) {
        statement = new UnknownStatement(statementText);
    }

    return statement;
}
}

我不确定为什么。有趣的是,上面显示的“parseStatement”行是来自“makeExpression”调用的调用链。这是正确的JavaScript行为,如果是这样,为什么我应该期待这种行为?我怎样才能达到预期的行为?

1 个答案:

答案 0 :(得分:0)

我对此并不完全确定,但我认为js不会通过标准将变量置于本地,因此所有这些函数可能全局附加(到window变量),因此可能相互覆盖。

尝试将var添加到所有这些定义(或适当的this.)。也许这会有所帮助。