0

同じ.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の動作ですか?もしそうなら、なぜこの動作を期待する必要がありますか?どうすれば意図した動作を得ることができますか?

4

1 に答える 1

0

これについては完全にはわかりませんが、jsは標準で変数をローカルにしないため、これらの関数はすべてグローバルに(window変数に)アタッチされ、相互に上書きされる可能性があります。

varそれらすべての定義に(またはthis.適切な場合は)追加してみてください。多分それは助けになるでしょう。

于 2012-04-21T22:42:08.380 に答える