2016-06-11 183 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