Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Meteor:为什么我会因为将函数(){}切换为()=>而丢失数据上下文;{ }?_Javascript_Meteor_Ecmascript 6 - Fatal编程技术网

Javascript Meteor:为什么我会因为将函数(){}切换为()=>而丢失数据上下文;{ }?

Javascript Meteor:为什么我会因为将函数(){}切换为()=>而丢失数据上下文;{ }?,javascript,meteor,ecmascript-6,Javascript,Meteor,Ecmascript 6,因此,我正在试验ES6,安装了grigio:babel包,并开始检查我的es5代码,在遇到问题时将其更新为一些新的ES6语法 最初,我的模板助手看起来像这样: Template.exampleTemplateName.helpers({ exampleHelper: function() { //returns an array from Mongo Collection } }); var self = this; process(function () { d

因此,我正在试验ES6,安装了grigio:babel包,并开始检查我的es5代码,在遇到问题时将其更新为一些新的ES6语法

最初,我的模板助手看起来像这样:

Template.exampleTemplateName.helpers({
   exampleHelper: function() {
      //returns an array from Mongo Collection
   }
});
var self = this;

process(function () {
  doSomethingWith(self);
});
在Blaze中使用的每个循环都是这样

{{#each exampleHelper}}
{{/each}}
正如您所料,此事件循环中元素的所有事件处理程序都可以访问Mongo集合中的字段,该字段由
exampleHelper
通过
this
关键字返回
this.exampleField
将返回我所期望的结果

现在是我开始更新到ES6的时候了。由于某种原因,以下语法会破坏数据上下文,因此它不会返回您期望的内容,而是返回
窗口

Template.exampleTemplateName.helpers({
    exampleHelper() {
        //returns an array from Mongo Collection
    }
});
以上是我第一次尝试,然后我尝试:

Template.exampleTemplateName.helpers({
    exampleHelper: () => {
        //returns an array from Mongo Collection
    }
});
因此,我通过Babeljs的在线翻译程序运行了上述ES6代码,并收到了以下内容,这显然是不正确的,因为我不需要命名函数:

Template.exampleTemplateName.helpers({
     exampleHelper: function exampleHelper() {}
});
有人能告诉我正确的语法应该是什么样的吗?

此代码将不起作用(它将显示窗口对象):

因为当您使用
=>
语法时,它希望执行如下操作:

Template.exampleTemplateName.helpers({
   exampleHelper: function() {
      //returns an array from Mongo Collection
   }
});
var self = this;

process(function () {
  doSomethingWith(self);
});
所以在这种情况下,
这个
确实等于
窗口
。解决方案是在这种情况下不使用
=>

有人能告诉我正确的语法应该是什么样的吗

您的原始代码非常好。你不必滥用这些特性,仅仅为了使用它们、保存一些密钥等等而使用它们。在这种情况下,你应该使用普通的匿名函数


之所以会与指向全局对象的
this
混淆,是因为箭头函数就是这样工作的:它们具有词法
this
,而不是动态的。这意味着
引用在函数创建时静态绑定到函数上下文(在您的情况下,它是
窗口
),而不是在运行时动态解析。

IIUC这实际上是一个功能:箭头函数没有自己的
,它们关闭这个
,就像它是来自父上下文的任何其他变量一样。所以这将是一种不应该使用箭头函数的情况?是的,我相信是这样。我没有将其作为答案发布,因为我不确定。为什么您需要在
exampleheloper
中引用
this
,它只是从Mongo返回一组数据?由于您有
{{{each exampleheloper}}
将不会引用该数组中的项。我没有在
exampleheloper
中引用
,我在绑定到{each}生成的元素的所有事件处理程序中引用
。实际上,arrow函数甚至不保存击键,方法定义更短(并且工作正常)。