【问题标题】:Will this function successfully make its data available in other contexts?该函数能否成功地使其数据在其他上下文中可用?
【发布时间】:2015-04-12 16:27:49
【问题描述】:

在这段代码摘录中,我试图确定setExtension 函数中的data 变量在 Object.keys 上下文中是否可用。由于setExtension 函数旨在在extension 可用时更改data.layout

function setExtension(file) {
  var data = files[file];
  if (extension) data.layout = data.layout + '.' + extension;
}

Object.keys(files).forEach(function(file){
  if (!check(file)) return;
  setExtension(file);
  debug('stringifying file: %s', file);
  var data = files[file];
  data.contents = data.contents.toString();
});

我会说setExtension 什么都不做,因为它在其范围内创建data 并且它不返回data。但是我很难确定我是否真的正确,或者忽略了一些琐碎的事情。

【问题讨论】:

  • 它不返回任何东西,但它确实改变了files[file].layout

标签: javascript node.js


【解决方案1】:

data 变量在其本地函数范围之外将不可用,因为它是使用 var 关键字声明的,并且 Javascript 具有函数级别范围。

如果您删除 var 关键字,那么它将可用,因为它将在全局对象上声明。 但是,这是bad idea,所以不要这样做

您可以改为从 setExtension 函数返回数据变量。

function setExtension(file) {
  var data = files[file];
  if (extension) data.layout = data.layout + '.' + extension;
  return data;
}

然后您可以通过更改 forEach 来获取数据变量:

Object.keys(files).forEach(function(file){
  if (!check(file)) return;
  var data = setExtension(file);
  debug('stringifying file: %s', file);
  data.contents = data.contents.toString();
});

【讨论】:

  • 然后您必须将setExtension 函数分配给新声明的data 变量,对吗?喜欢:var data = setExtension(file)?
  • 在每次迭代中创建var 不是一项昂贵的操作吗?还是很难判断?
  • 在 Javascript 中创建变量并不是一项昂贵的操作,因为变量只是引用。无论哪种方式,您都将调用setExtension 函数,这更昂贵。
  • 此时值得记住premature optimization is the root of all evil。如果您在尝试编写高性能代码时陷入困境,那么您最终会使其更难维护。完成它,然后如果它运行得太慢,请返回并开始对其进行分析。
猜你喜欢
  • 1970-01-01
  • 2012-12-19
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2012-12-17
  • 2018-01-14
相关资源
最近更新 更多