在文件之间共享JS函数而不将它们全局化或将它们附加到全局对象?

时间:2015-06-24 14:58:20

标签: javascript

假设我有一个我想在多个文件之间重用的功能。我可以把它变成全球性的,但这并不好。

master_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对象)的值附加。

master_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);

2 个答案:

答案 0 :(得分:2)

如果你想避免使用全局变量(你应该!),你应该看一下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);

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

答案 1 :(得分:0)

可以使用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);