我目前正在開發一個項目,該項目允許您在一個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>
我也嘗試應用窗口的功能,但唉,也沒有工作。
「所有這些都在一個私人函數中,以至於無法簡單地使用控制檯。」對,就好像人們不能用您在腳本中提供的數據來僞造XHR請求。安全性和驗證與前端無關,您必須在後端進行驗證。 –
嗯,但它迫使人們實際閱讀和理解腳本,而不是在控制檯中弄亂變量,這會有點困難,因爲我使用的是彗星頻道,並且頻道創建並限制爲私人功能。複製頻道我認爲是不允許的,一旦它在頁面中創建一次。因此使得僅僅通過控制檯使用通道變得更加困難。 –
您不能訪問在閉包之外聲明的第一個'x',因爲它被閉包中聲明的'x'遮蔽。如果你從第三行刪除了關鍵字'var',你就可以訪問這個外部變量,但是你會在同一行覆蓋它的值(現在只是'x = 10'),這不是你想要什麼。這是通常與使用全局變量相關的許多問題之一。 – leftclickben