【问题标题】:Sharing JS functions between files without making them global or attaching them to a global object?在文件之间共享 JS 函数而不使它们成为全局或将它们附加到全局对象?
【发布时间】:2015-06-24 14:58:19
【问题描述】:

假设我有一个要在多个文件之间重复使用的函数。我可以让它全球化,但这并不好。

ma​​ster_file.js

add = function(num1, num2){
  return num1 + num2;
};

subtract = function(num1, num2){
  return num1 - num2
};

file1.js

add(4,4);

file2.js

add(9,1);

file3.js

subtract(8,2);

相反,我可以创建一个全局对象并将函数附加为全局对象的值(或者像其他人一样使用window 对象)。

ma​​ster_file_v2.js

var add = function(num1, num2){
  return num1 + num2;
};

var subtract = function(num1, num2){
  return num1 - num2
};

global = {

  add: function(num1, num2){
    return add(num1, num2);
  },
  subtract: function(num1, num2){
    return subtract(num1, num2);
  }

};

那我就得像这样调用函数了。

file1.js

global.add(4,4);

file2.js

global.add(9,1);

file3.js

global.subtract(8,2);

有没有办法像这样调用函数?我宁愿像以前一样直接用它们的名字来称呼它们,但不将它们声明为全局的。

file1.js

add(4,4);

file2.js

add(9,1);

file3.js

subtract(8,2);

【问题讨论】:

标签: javascript


【解决方案1】:

如果你想避免使用全局变量(你应该!),你应该看看 CommonJSHarmony 模块。

使用模块系统可以让你做这样的事情:

//utils.js

module.exports = function () {
  return {
    add: function (num1, num2) {
      return add(num1, num2);
    },
    subtract: function (num1, num2) {
      return subtract(num1, num2);
    }
  };
};

//file1.js

var add = require('./utils').add;
var subtract = require('./utils').subtract;

add(4,4);
subtract(8,2);

或事件更好地使用 Harmony 的解构功能:

var {add, subtract} = require('./utils');

add(4,4);
subtract(8,2);

使用模块可以使您的代码更加模块化,并在保持全局范围干净的同时使代码重用变得容易。

【讨论】:

  • 谢谢。我现在知道为什么人们使用modules。通常我会使用它,但我正在使用 Meteor,我意识到这可能会发生冲突:stackoverflow.com/questions/31030979/…
  • 抱歉,不知道您使用的是 Meteor。不幸的是,由于整个 Meteor 编码风格是围绕全局变量构建的,我认为您无法改进当前的解决方案。
  • 好吧,公平地说,我没有提到 Meteor,因为我没有意识到它会成为共享功能的一个重要因素。只有当我读到你的回复时,我才“哦……废话”,并意识到我需要为 Meteor 生态系统提出一个单独但类似的问题,哈哈。
【解决方案2】:

可以使用with,但已弃用。首选方法是将它们分配给局部变量,基本上与您在 master_file 中所做的相反

file1.js

var add = global.add
add(4,4);

file2.js

var add = global.add
add(9,1);

file3.js

var subtract = global.subtract
subtract(8,2);

【讨论】:

  • 哦,我明白了,哈哈。这很聪明。
猜你喜欢
  • 2011-02-09
  • 2015-03-07
  • 2019-01-15
  • 1970-01-01
  • 2016-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多