2010-07-26 34 views
6
var foo = "function(){ alert('meee'); }"; 
foo(); 

Tôi đã thử ở trên nhưng nó không hoạt động là có cách nào khác để thực thi hàm đó mà không sử dụng eval?thay đổi chuỗi thành hàm trong javascript (không phải eval)

thnx

+0

Nếu bạn có thể cụ thể hơn về vấn đề của mình, có thể là một giải pháp thay thế cho phương pháp này mà bạn không cần sử dụng eval. – rfunduk

+0

cũng 'function() {alert ('mee');}' là một văn bản đã quản lý để nắm bắt bây giờ tôi cần phải gọi chức năng ... tôi nghĩ rằng ví dụ trên hoạt động trên php thats có lẽ làm thế nào tôi có ý tưởng ... do đó chức năng được lấy từ một '

function(){alert('meee')}
' innerhtml vì vậy tôi sẽ nghĩ rằng nó sẽ là một văn bản – Val

Trả lời

8

bạn muốn sử dụng trực tiếp một nhà xây dựng Function, như Anders cho biết. Tất cả các đối số là chuỗi. Đối số cuối cùng là phần thân của hàm, bất kỳ đối số đầu tiên nào cũng là tên của các đối số mà hàm nhận được.

Để mượn từ ví dụ Anders',

var multiply = new Function("x", "y", "return x * y"); 

sẽ như thế nào viết

var multiply = function (x,y) { 
    return x * y 
} 

Trong trường hợp của bạn, bạn có "function(){ alert('meee'); }" và bạn muốn lưu nó như là một chức năng để var foo.

var fn = "function(){ alert('meee'); }"; 
var foo = new Function("return ("+fn+")")(); 
foo(); 
// alerts "meee" 

Sự khác biệt giữa Functionevaleval chạy trong phạm vi cá nhân, trong khi Function chạy trong phạm vi toàn cầu.

var x="haha", y="hehe"; 

function test() { 
    var x=15, y=34; 
    eval("alert('eval: ' + x + ', ' + y)"); 
    new Function("alert('Func: ' + x + ', ' + y)")(); 
} 

test(); 

// eval: 15, 34 
// Func: haha, hehe 

Đừng cố gắng chạy nó trong bảng điều khiển, bạn sẽ nhận được kết quả lừa dối (bàn giao tiếp sử dụng eval). Viết nó trong một thẻ <script> và tải nó trong trình duyệt sẽ cho kết quả thực sự.

+0

không phải cách mà hàm tạo' Hàm' tạo ra hàm này giống như cách 'eval' thực hiện. nó thực sự chỉ là một dạng 'eval' khác, vì vậy tất cả điều này thực sự là tránh sử dụng từ' eval'. nhưng bạn cũng có thể làm điều đó như 'cửa sổ [(typeof [] [0]) [3] +" val "] (" 4 + 3 ")', cung cấp '7'. – Claudiu

+0

tôi phải nhắc lại. bạn nói rằng bạn đang sợ tiêm script hoặc những người ăn cắp mật khẩu của bạn nếu bạn sử dụng 'eval'. tốt, ** NÀY LÀ SỬ DỤNG EVAL ** !!! đó là điều tương tự - mã tùy ý đang được JS biên soạn và chạy. tại sao bạn muốn người dùng có thể cung cấp các chức năng của riêng họ cho mã của bạn? – Claudiu

0

không mà tôi biết ... có thể là một cách tốt hơn để làm những gì bạn đang cố gắng làm mà không làm cho mình dễ bị một cuộc tấn công tiêm kịch bản mà không liên quan đến thông qua xung quanh javascript như một chuỗi.

+0

Tôi biết :) tôi đã tìm kiếm rất nhiều về điều này nhưng tôi cần một an toàn như tôi đã đọc về eval cũng cho phép chỉ nói tôi có ấn tượng rằng bạn có thể cung cấp tên người dùng và mật khẩu cho mọi người hoặc xóa mọi thứ urself :) – Val

+0

nó thực sự phụ thuộc vào nơi javascript của bạn đến từ đâu? nếu nó nằm trong một cơ sở dữ liệu và cách duy nhất các chuỗi mã có được trong đó là bởi một biểu mẫu an toàn hoặc những gì có bạn, bạn có thể ok. Mặt khác, nếu bạn đang cho phép bất cứ ai đặt mã thực thi tùy ý vào chương trình phụ trợ của bạn, bạn có thể đang gặp rắc rối. Hầu hết các cuộc tấn công javascript tôi có thể thụ thai là chủ yếu sẽ ảnh hưởng đến sự tương tác của người dùng, thay vì cơ sở dữ liệu của bạn. Những gì bạn đang ám chỉ có lẽ là một kịch bản ghi nhật ký bàn phím và gửi chúng đến một trang web từ xa thông qua các bài viết xhr hoặc tương tự. – vicatcu

+0

từ phần tử html innerhtml .. – Val

3

Theo MDC. Sử dụng:

var multiply = new Function("x", "y", "return x * y"); 
var theAnswer = multiply(7, 6); 
+0

Tôi chắc chắn tôi đã không yêu cầu cho một bài học toán học. tất cả những gì tôi muốn là tạo một chuỗi chứa hàm như văn bản và gọi nó. nó dễ sử dụng eval, không an toàn và rất chậm. – Val

+1

@Val, đây là ví dụ về những gì bạn nên sử dụng, đọc trang tham khảo. – Anders

+0

Tôi đề nghị bạn nên đọc lại nó khi nó nói thuộc tính ...'arguments Không được chấp nhận' và' arity deprecated ' – Val

Các vấn đề liên quan