2012-10-21 67 views
2

可能重複:
Why is using the JavaScript eval function a bad idea?JavaScript字符串作爲命令行,爲什麼不eval()?

所以,我經歷了許多不同的方法從一個字符串調用一個函數,使用window[]();eval();閱讀。我想知道是否對於我的情況(下面)是什麼方法是正確的方式,如果是這樣,解釋原因。還要解釋爲什麼eval();不是一個好的選擇,很多人都說安全性,但是如果您可以獲得任何瀏覽器插件,使您能夠更改該頁面上的腳本,爲什麼安全性會成爲問題? (例如:Firefox的Firebug)

我當前的代碼:

funcOne(target).funcTwo(x, y, z); 

會如何使用推薦window[]();方式調用這個?爲什麼我不能用這個?:

eval('funcOne(target).funcTwo(x, y, z)'); 

我不希望你這個問題的煩惱被問了很多次,因爲我目前不能想辦法來調用,作爲調用它,做雙功能。

在此先感謝!

+0

所以你正在試圖構建一個類似Firebug的命令行?請多給點信息。 「eval」可能是正確的選擇,取決於你想達到的目標。 – user123444555621

+0

我沒有看到你怎麼會在這個問題上感到困惑,認爲我想製作一個類似螢火蟲的命令行,但我的意思是我想調用一個從未知的信息生成的函數在運行前,所以我保存並執行它,但是如何? – pathurs

回答

6

在Javascript中,語法a.b可以替換爲a["b"]。所以你的情況,你可以使用

window["funcOne"](target)["funcTwo"](x, y, z); 

僅當您使用變量而不是"funcOne""funcTwo"這裏當然是有意義的。

如果一切而不是固定的,但你只是想延後執行,你可以使用「置信轉換」與匿名封閉與

x = function(){ return funcOne(target).funcTwo(x, y, z); }; 

,然後你可以用x()評估以後得到期望的結果。

的最後一個例子將正常工作,即使變量targetxyz是局部的封閉範圍,因爲置信轉換關閉將「捕捉」他們。

但是你應該注意一個事實,即在Javascript中創建一個新範圍的唯一方法是使用一個函數(一個包含{}的塊不是像在C++和其他語言中那樣的範圍)。

如果你需要在一個循環這可以咬回來,是一個相當常見的錯誤的源創建幾個倒閉......

for (var i=0; i<options.length; i++) 
{ 
    var menu_item = document.createElement("div"); 
    menu_item.textContent = "Option " + i; 
    menu_item.onclick = function() { 
     // Warning this will NOT work. All divs will 
     // alert using the same number! 
     alert("Option " + i + " selected"); 
    } 
    menu.appendChild(menu_item); 
} 

這裏我使用了一個閉合的onclick事件上的div但這不起作用,因爲所有這些函數都會使用相同的i變量。因爲在Javascript來創建範圍的唯一方法是使用功能的解決方案是:

for (var i=0; i<options.length; i++) 
{ 
    var menu_item = document.createElement("div"); 
    menu_item.textContent = "Option " + i; 
    (function(i){ 
     menu_item.onclick = function() { 
      alert("Option " + i + " selected"); 
     }; 
    })(i); // Pass current `i` as parameter 
    menu.appendChild(menu_item); 
} 

這樣,onclick處理程序內的變量i將是每個封閉不同。

創建函數只是爲了立即調用它的這種模式經常用在Javascript中,因爲當你需要創建許多獨立的閉包時,所以最好能夠知道並理解它。

+0

當所有變量,目標,x,y和z都被作用域並且我需要在不在同一範圍內的任何時候調用它時,我將如何使用x()來實現第二個示例? – pathurs

+0

@pathurs:它會工作,因爲thunk會「捕獲」局部變量。但是,如果您需要創建許多thunk,則必須瞭解捕獲的是**變量**而不是變量**的**值,並且通常錯誤是創建許多無意共享相同變量的閉包。請參閱擴展說明... – 6502

+0

接受和由於答案的詳細信息和多個示例給出最佳答案 – pathurs

相關問題