2013-02-03 65 views
1

我目前正在開發一個項目,該項目允許您在一個textarea中輸入Javascript並運行它。有很多後臺代碼監視頁面並向服務器發送數據。所有這些都在一個私人的功能,以便不能簡單地使用控制檯。那麼唯一的問題是在textarea中輸入的代碼在包含服務器功能的私有函數內部被評估,從而使它能夠訪問站點的內部。我如何隔離它並使其成爲私人功能之外的範圍?一個例子如下:Javascript高級關閉

<script> 

var x = 2; 
(function(){ 
    var x = 10; 
    var elem = document.createElement('button'); 
    elem.addEventListener('click',function(){ 
     alert(x); 
    }); 
    document.body.appendChild(elem); 
})(); 

</script> 

在這個例子中,我希望x返回2而不是10當按鈕被按下。從而迫使它運行,就好像它在全球範圍內一樣。

編輯

我已經試過功能結合其似乎在下降正道的窗口,但沒有我一直在尋找的效果。

<script> 

var x = 2; 
(function(){ 
    var x = 10; 
    var elem = document.createElement('button'); 
    elem.addEventListener('click',(function(){ 
     alert(x); 
    }).bind(window)); 
    document.body.appendChild(elem); 
})(); 

</script> 

我也嘗試應用窗口的功能,但唉,也沒有工作。

+6

「所有這些都在一個私人函數中,以至於無法簡單地使用控制檯。」對,就好像人們不能用您在腳本中提供的數據來僞造XHR請求。安全性和驗證與前端無關,您必須在後端進行驗證。 –

+0

嗯,但它迫使人們實際閱讀和理解腳本,而不是在控制檯中弄亂變量,這會有點困難,因爲我使用的是彗星頻道,並且頻道創建並限制爲私人功能。複製頻道我認爲是不允許的,一旦它在頁面中創建一次。因此使得僅僅通過控制檯使用通道變得更加困難。 –

+1

您不能訪問在閉包之外聲明的第一個'x',因爲它被閉包中聲明的'x'遮蔽。如果你從第三行刪除了關鍵字'var',你就可以訪問這個外部變量,但是你會在同一行覆蓋它的值(現在只是'x = 10'),這不是你想要什麼。這是通常與使用全局變量相關的許多問題之一。 – leftclickben

回答

0

事實證明,答案比我想象的要簡單得多。全局範圍內但在關閉函數之外的函數可以由任何函數調用,但它只能訪問全局範圍中的變量。因此下面的例子完美地工作。

<script> 

var run = function(){alert(x);}; 
var x = 2; 
(function(){ 
    var x = 10; 
    var elem = document.createElement('button'); 
    elem.addEventListener('click',run); 
    document.body.appendChild(elem); 
})(); 

</script> 
0

在你編輯版本更改警報(x)的提醒( .X)。 它解決你的問題嗎?

+0

這是行不通的,但是因爲用戶提供的不是我的代碼,我不能完全要求他們輸入每個變量的盈方。您看到的目的是隱藏用戶提交的代碼中的第二個x。 –