我正致力于让https://github.com/donmccurdy/expression-eval正确支持包含this
的表达式。
模块定义了一个函数:
function evaluate ( node, context ) {
...
}
将其导出为eval
:
module.exports = {
parse: jsep,
eval: evaluate,
compile: compile
};
在我的代码中,我为this
定义了一个本地上下文并调用expr.eval
:
const expr = require( 'expression-eval' );
function test() {
console.log( this ); // outputs the right thing
var context = { baz: 'blah' };
var ast = expr.parse( 'this.A + baz' );
var val = expr.eval( ast, context );
console.log( val ); // outputs "undefinedbaz"
}
test.apply( { A: 'aay', B: 'bee } );
在evaluate()
内,我插入了console.log( this )
。最初,它是全球性的对象。我添加了'use strict';
,并将其更改为undefined
。
我已经尝试了我能想到的所有内容,以使this
的值在evaluate
函数中具有正确的值:
var fn = expr.eval.bind( this );
fn( ast, context );
和
expr.eval.apply( this, [ ast, context ] );
没有任何作用。这几乎就好像require
做了一些坏事,这打破了使用.apply
的能力
我该如何解决这个问题?
答案 0 :(得分:0)
事实证明,在JavaScript中,无论何时调用函数(而不是对象方法),除非使用.bind()
,.call()
或.apply()
,否则{的值{1}}总是丢失。谁知道?
解决方案包括:
1)在递归函数中,使用this
.call()
2)包装你的功能并保存function silly(i) {
if ( i < 1 ) // do something with this
else return silly.call( this, i-1 );
}
以供参考
this