为什么外部JavaScript文件可以访问其他外部JavaScript文件功能以及如何停止它?
我决不是一个带JavaScript的古鲁,所以如果这个问题听起来像“初学者”,我很抱歉。但为什么如果我在一个项目中有3个JavaScript文件,这3个JavaScript文件中的任何一个都可以调用其他JavaScript文件中的其他函数?
更大的问题是如何停止?一个例子是,如果这3个假设的JavaScript文件中,只是说他们被命名为ManagerJS.js,TeamAJS.js和TeamBJS.js,我不希望TeamAJS能够访问TeamBJS,但我希望他们都是能够访问ManagerJS。为什么外部JavaScript文件可以访问其他外部JavaScript文件功能以及如何停止它?
网页上的所有脚本在全球范围内进行了评估。每个页面有一个共享的全局范围。
您可以通过不在全球范围内定义的东西阻止访问。您可以使用IIFE为每个脚本创建一个私有范围:
// myScript.js
(function() {
// everything declared here is *local* to this function
var localValue = 42;
// we could expose values by explicitly creating global variables
// (but there are other, more elaborate ways)
window.globalValue = 21;
}());
只有公开您希望其他代码/脚本访问值。有很多种方法可以做到这一点,其中之一就是revealing module pattern。
参见What is the purpose of a self executing function in javascript?
感谢方向 – Chris
这听起来像你想使用某种依赖注入系统。这里有很多选项,其中包括CommonJS,RequireJS,ES6进口以及其他许多选项。
下面是CommonJS的
// in TeamAJS.js...
// gain reference to Manager script
var Manager = require('./ManagerJS')
// do things with Manager
// note: can't access TeamBJS unless you require it as a dependency
module.exports = {
// put methods or variables in here that you wish to expose to other modules
}
的RequireJS网站有a nice article on modules
的例子为每页燎共享全局范围。您可以通过不在全局范围内定义内容来阻止访问。您可以使用IIFE为每个脚本创建一个专用范围。搜索“显示模块模式”。 –
IIFE:https://en.wikipedia.org/wiki/Immediately-invoked_function_expression – ceejayoz
重复。见http://stackoverflow.com/a/111111/6326441 –