2013-05-07 42 views
1

我有一個函數接受另一個函數作爲參數。 外部函數是否有可能在不知道它做什麼的情況下運行內部函數,並避免嘗試對受保護作用域中的任何變量進行任何更改。如何在JS應用程序中擁有一個受保護的作用域,該應用程序絕不會受到任何其他函數的影響?

注意:受保護,我沒有提到Java,C++或C#中提供的受保護的繼承範圍說明符。

實施例:

假設我有一個功能的處理器。

{ 
// processor is a function of an object which has input and output be parameters 
function processor(functionToExecute) 
{ 
    this.output = functionToExecute(this.input); 
} 

} 

現在我不知道functionToExecute會運行什麼代碼。

我在全局範圍內有幾個變量a,b或c。 我不希望它們受到影響,或者在全局範圍內的任何其他函數被從functionToBeExecuted調用。 我只是想讓它接受參數並給出輸出。

但應該不會有副作用影響超出範圍的任何事情。

理想情況下,我會從用戶那裏詢問這個函數,並在服務器上運行它來處理用戶想要的一段數據。

+3

您傳入的函數已經有了不同的範圍,您不會對外部函數做任何更改...您可以發佈一些代碼,也許我沒有想到... – elclanrs 2013-05-07 09:00:01

+0

什麼是你的意思是受保護? – 2013-05-07 09:02:31

+0

現在檢查。我已經添加了一個例子和我的意圖。 – 2013-05-07 09:14:37

回答

1

函數的作用域在聲明時確定,而不是在執行時確定。

var a = 1; 
var b = 2; 
var b = 3; 

function foo(fn){ 

    //JS is function-scoped. It's the only way you can create a new scope. 
    //This is a new scope. It cannot be accessed from the outside 
    var a = 4; 
    var b = 5; 
    var b = 6; 

    //We call the passed function. Unless we pass it some references from this scope 
    //the function can never touch anything inside this scope 
    fn('hello world'); 
} 

foo(function(hw,obj){ 

    //the function passed is defined here where, one scope out, is the global scope 
    //which is also where a, b and c are defined. I can *see* them, thus they are 
    //modifiable 
    console.log(a,b,c); //123 
    a = 7; 
    b = 8; 
    c = 9; 
    console.log(a,b,c); //789 

    console.log(hw); //hello world 

}); 

此外,全局在代碼可見隨時隨地。任何代碼可以修改全局變量,除了WebWorkers之類的一些情況,但這是另一回事。

這裏有一個如何使用即時功能隱藏值的例子,只公開功能使用它們:

(function(ns){ 

    var width = 320; 
    var height = 240; 

    ns.getArea = function(fn){ 
    fn.call(null,320 * 240); 
    } 

}(this.ns = this.ns || {})); 

//let's get the area 
ns.getArea(function(area){ 
    console.log(area); 
}); 

//In this example, we have no way to modify width and height since it lives inside 
//a scope that we can't access. It's modifiable only from within the scope 
//or using a "setter" approach like in classical OOP 

但對於對象,它們是通過引用傳遞。一旦你將它們傳遞到某個地方,它們可能會修改

+0

所以,如果我有一個Json對象列表。我想接受來自用戶的功能,然後我想在整個列表中將該函數作爲映射運行,並在客戶端上向用戶顯示一個新列表,顯示其代碼的作用。 我如何做到這一點,確保用戶不會寫任何影響列表項以外的任何內容? – 2013-05-07 09:27:47

+0

@AmoghTalpallikar將你的東西放在無法通過任意代碼訪問的作用域中。我建議你閱讀如何在JS中模擬私有範圍,以更多地瞭解保護值。 – Joseph 2013-05-07 09:32:51

相關問題