0

对于 Web 开发(以及更多),我最喜欢的编辑器是伟大的 atom 编辑器,它是 github 的开源项目。

像许多代码编辑器一样,我们可以通过安装大量插件来扩展它。其中,我使用atom-ternjs

带有 tern.js 的 atom 的 Javascript 代码智能。通过 autocomplete-plus 使用建议提供程序。

今天,我在编辑器窗口右上角的“警报样式”闪存消息框中收到此错误:

TypeError:无法在 Object.exports.typeFromContext ( /home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/infer.js:1623:24) 在 Object.findCompletions [运行时] (/home/poremil/.atom/packages/atom-ternjs /node_modules/tern/lib/tern.js:684:23) 在 Object.exports 上运行 (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:218:30) .withContext (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/infer.js:774:18) 在/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/ lib/tern.js:225:13 at analyzeAll (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:339:15) 在 doRequest (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib/tern.js:209:5) 在 Object.signal.mixin.request (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/lib /tern.js:149:7) 在响应 (/home/poremil/.atom/packages/atom-ternjs/node_modules/tern/bin/tern:224:10)

但是,a 没有注意到我的工作流程中的任何特定错误。也就是说,我想了解发生了什么。

我也在github项目上开了一个issue

4

1 回答 1

1

是的,这看起来确实像一个错误。这是破坏代码的简化摘录:

var findTypeFromContext = {
  NewExpression: function() { return this.CallExpression() }
  ,CallExpression: function() { console.log('calling expression'); }
}
var finder = findTypeFromContext['NewExpression'];
finder();

由于this关键字,这会中断。

  1. 赋值采用var finder = findTypeFromContext['NewExpression'];NewExpression 方法“out”(与父对象分离)。
  2. 通过这个赋值,this关键字现在指向当前的父对象——CallExpression 不存在的地方。

我的快速解决方法是立即调用对象上的函数,这样仍然指向正确的位置:

var findTypeFromContext = {
  NewExpression: function() { this.CallExpression() }
  ,CallExpression: function() { console.log('calling expression'); }
}
findTypeFromContext['NewExpression']();
于 2015-08-15T14:53:38.237 回答