Javascript 在文件之间共享JS函数而不使其成为全局函数或将其附加到全局对象?

Javascript 在文件之间共享JS函数而不使其成为全局函数或将其附加到全局对象?,javascript,Javascript,假设我有一个函数,我想在多个文件之间重复使用。我可以让它全球化,但那不好 master_file.js add = function(num1, num2){ return num1 + num2; }; subtract = function(num1, num2){ return num1 - num2 }; add(4,4); add(9,1); subtract(8,2); var add = function(num1, num2){ return num1 +

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

master_file.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file1.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file2.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file3.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
相反,我可以创建一个全局对象,并将函数作为全局对象的值附加(或者像其他对象一样附加到
窗口
对象)

master_file_v2.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
然后我必须像这样调用函数

file1.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file2.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file3.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
有没有办法不这样调用函数?我更愿意像以前一样直接用他们的名字来称呼他们,但不要宣布他们是全球性的

file1.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file2.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file3.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);

如果您想避免使用globals(您应该这样做!),那么您应该查看或模块

使用模块系统将允许您执行以下操作:

//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);
使用模块使您的代码更加模块化,并使代码重用更加容易,同时保持全局范围的整洁。

使用模块是可能的,但这一点已被弃用。首选的方法是将它们分配给局部变量,基本上与您在master_文件中所做的相反

file1.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file2.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);
file3.js

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

subtract = function(num1, num2){
  return num1 - num2
};
add(4,4);
add(9,1);
subtract(8,2);
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);
  }

};
global.add(4,4);
global.add(9,1);
global.subtract(8,2);
add(4,4);
add(9,1);
subtract(8,2);
var add = global.add
add(4,4);
var add = global.add
add(9,1);
var subtract = global.subtract
subtract(8,2);

哦,我明白了,哈哈。那很聪明,谢谢。我现在知道人们为什么使用
模块了。通常我会用这个,但我用的是Meteor,我意识到这可能会有冲突:啊,对不起,我不知道你用的是Meteor。不幸的是,由于整个Meteor编码风格都是围绕全局变量构建的,我认为您无法改进当前的解决方案。公平地说,我没有提到Meteor,因为我没有意识到它在共享函数时会是一个重要因素。只有当我读到你的回答时,我才意识到我需要为流星生态系统提出一个单独但类似的问题,哈哈。