Function.apply(x)/。bind(x)导致`this`为`undefined`

时间:2017-12-12 01:58:42

标签: javascript require

我正致力于让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的能力

我该如何解决这个问题?

1 个答案:

答案 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