2016-06-11 115 views
1

我决不是一个带JavaScript的古鲁,所以如果这个问题听起来像“初学者”,我很抱歉。但为什么如果我在一个项目中有3个JavaScript文件,这3个JavaScript文件中的任何一个都可以调用其他JavaScript文件中的其他函数?

更大的问题是如何停止?一个例子是,如果这3个假设的JavaScript文件中,只是说他们被命名为ManagerJS.js,TeamAJS.js和TeamBJS.js,我不希望TeamAJS能够访问TeamBJS,但我希望他们都是能够访问ManagerJS。为什么外部JavaScript文件可以访问其他外部JavaScript文件功能以及如何停止它?

+3

的例子为每页燎共享全局范围。您可以通过不在全局范围内定义内容来阻止访问。您可以使用IIFE为每个脚本创建一个专用范围。搜索“显示模块模式”。 –

+0

IIFE:https://en.wikipedia.org/wiki/Immediately-invoked_function_expression – ceejayoz

+0

重复。见http://stackoverflow.com/a/111111/6326441 –

回答

2

网页上的所有脚本在全球范围内进行了评估。每个页面有一个共享的全局范围。

您可以通过在全球范围内定义的东西阻止访问。您可以使用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?

+0

感谢方向 – Chris

1

这听起来像你想使用某种依赖注入系统。这里有很多选项,其中包括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

+0

我有点希望它会工作就像在你有一个控制器或页面背后的代码来引用类C#项目。 IE 使用MyProject.Models – Chris

+0

我不明白为什么这样设置它会是一个问题。 –

+0

我想问题在于不知道如何去做 – Chris