2015-04-30 28 views
21

Nếu tôi có mã JavaScript sau:Removed JavaScript là vẫn thực thi

<script id="someJS"> 

    var boom = 'boom'; 

    function example(){ 

     alert(boom); 
    } 

</script> 

và sau đó làm:

$('#someJS').remove(); 

tôi vẫn có thể gọi example() dù rằng hàm JavaScript không còn bên trong DOM ... Làm thế nào tôi có thể loại bỏ nó?

Tôi không muốn vô hiệu (các) chức năng thực tế và các biến với: boom = null; example = null; vì tôi không phải lúc nào cũng biết nội dung bên trong tệp JavaScript. Ví dụ: tên hàm, biến, v.v. Tôi cần có khả năng xóa toàn bộ nội dung nằm trong thẻ tập lệnh đó.


Cập nhật: Đối với những người muốn biết các trường hợp sử dụng cho việc này:

Về cơ bản trong một ứng dụng tôi đang làm việc trên, chúng tôi có thêm tùy chỉnh JavaScript cho khách hàng chắc chắn rằng khi một nút được nhấp ví dụ lưu, sau đó kiểm tra xem một số hàm có tồn tại không và sau đó chạy chúng. Tuy nhiên, vì nút lưu này là chung chung, điều đó có nghĩa là mã tùy chỉnh được gọi tất cả thời gian sau khi được thêm ngay cả khi mã không còn liên quan nữa.

Các giải pháp chúng tôi đã đưa ra (ai đó đã đăng tải này như một câu trả lời nhưng họ loại bỏ nó vì một lý do) là không gian tên nó tất cả như:

DynamicJS = { 

    boom: 'boom', 

    example: function(message) { 

     alert(message); 

    } 

} 

Và sau đó chúng tôi chỉ có thể làm: delete DyanmicJS;

Loại bỏ tất cả các chức năng và biến bên trong vùng tên này khỏi phạm vi toàn cầu, hiệu quả khi tắt tệp tập lệnh được thêm vào.

Mặc dù tôi chắc chắn đây không phải là giải pháp hoàn hảo như thể bạn có người nghe sự kiện bên trong tệp, tôi chắc chắn rằng họ vẫn sẽ tồn tại!

+6

_ "Tôi không muốn vô hiệu chức năng thực sự, vì tôi không phải lúc nào cũng biết nội dung bên trong tệp JS." _ Chính xác thì ý bạn là gì? – Cerbrus

+0

Như trong 'ví dụ = null'; – Cameron

+1

Tại sao bạn vẫn muốn xóa một hàm? khía cạnh tiêu cực của vẫn còn có nó là gì? –

Trả lời

36

Tôi làm cách nào để xóa? Tôi không muốn null chức năng thực tế, vì tôi không phải luôn luôn biết những gì là bên trong các tập tin JS.

Bạn không thể. Mã script được thực hiện, tạo ra mọi thứ trong môi trường JavaScript và là hoàn toàn bị ngắt kết nối từ phần tử script đã tải nó. Ngoài việc tải lại hoàn toàn môi trường đó, nếu bạn không biết mã đã làm gì, bạn không thể hoàn tác nó.

Thậm chí nếu bạn có thể phỏng đoán một số mã đã làm (ví dụ: bằng cách tạo danh sách hình cầu trước và sau), trong khi bạn có thể xóa hình cầu mới bạn đã phát hiện (hoặc ít nhất là đặt thành null hoặc undefined, delete không hoạt động wiith globals được thêm thông qua khai báo hàm hoặc var), không cho bạn biết trình xử lý sự kiện, công nhân web, v.v. mã có thể đã được kết nối.

+3

Đây có lẽ là câu trả lời phù hợp nhất ở đây, đặc biệt liên quan đến yêu cầu của OP: * nếu bạn không biết mã đã làm gì, bạn không thể hoàn tác nó *. – CodingIntrigue

+0

@RGraham Hoặc, trong một câu ngắn: * Bạn không thể bỏ chạy những gì đã chạy *. –

16

$('#someJS').remove();chỉ xóa phần tử tập lệnh khỏi trang.
Khi phần tử bị xóa, tập lệnh đã được giải thích, có nghĩa là example đã được thêm vào phạm vi toàn cầu.

Để xóa bỏ hoàn toàn mà chức năng bạn có thể làm điều này:

window.example = null; 

Tuy nhiên, rõ ràng là bạn không muốn làm điều này, và điều này sẽ gây ra một tải trọng của lỗi nếu có kịch bản khác mà thực sự sử dụng example .

Một thay thế có thể là để gán một chức năng có sản phẩm nào với nó:

window.example = function(){}; 

Điều này sẽ ngăn chặn sự "loại bỏ" từ dẫn đến sai sót.
(Ngoài chức năng không trả lại giá trị khi có thể được mong đợi)

6

Khi chức năng đã được xử lý, nó hiện là một phần của danh sách chức năng thực thi của window - bất kể bạn có xóa nguồn gốc hay không không phải.

Để loại bỏ các chức năng hoàn toàn, hãy thử:

window['example'] = null; 

Tuy nhiên, dựa trên nhận xét cuối cùng của bạn:

Tôi không muốn để null chức năng thực tế, như tôi làm không phải lúc nào biết có gì bên trong tệp JS.

Có vẻ như bạn muốn duy trì tham chiếu đến hàm nhưng không thể thực thi trực tiếp? Nếu đó là trường hợp, bạn có thể lưu trữ một tham chiếu đến nó và loại bỏ các gốc:

var _exampleBackup = window['example']; 
window['example'] = null; 

Để gọi nó, bây giờ bạn có thể sử dụng:

_exampleBackup(); 

Và để khôi phục lại nó, nếu bạn cần phải:

window['example'] = _exampleBackup; 
example(); 
+0

Rõ ràng, [đây chính xác là những gì OP không muốn] (http://stackoverflow.com/questions/29970467/removed-javascript-is-still-executable#comment48060679_29970467). (Vì lý do nào đó ...) – Cerbrus

+0

@Cerbrus whoah, hoàn toàn bỏ lỡ nhận xét cuối cùng! Chỉ cần cập nhật câu trả lời của tôi cho địa chỉ - cảm ơn bạn rất nhiều vì đã chỉ ra nó ... tổng số \ * facepalm \ * moment = P – newfurniturey

+0

Cần phải làm rõ hơn rằng "Khi chức năng đã được xử lý" đề cập đến thẻ '

1

$('#someJS').remove(); không có gì khác ngoài việc xóa text khỏi DOM, nhưng không làm gì với chức năng thực tế (cũng không phải tệp), vì nó được phân tích cú pháp và thực thi.

Để xóa chức năng, bạn có thể hoặc là đặt nó vào null hoặc đơn giản là ghi đè lên nó với example=function(){};

0

JavaScript Hoisting

Có một khái niệm trong JavaScript gọi tời kéo. Trong giai đoạn này, trình biên dịch phân tích tất cả các mã JavaScript và khai báo các biến và hàm ở đầu phạm vi. Trong trường hợp của bạn, ví dụ chức năng và bùng nổ biến đã được khai báo và lưu giữ trong bộ nhớ. Khi bạn chạy phương thức đó, trình thông dịch sẽ gọi phương thức đó và giải thích nó thay vì giải thích mã JavaScript thực. Bạn đang xóa khối tập lệnh sau khi nó đã đi vào bộ nhớ. Và đó là lý do tại sao nó vẫn thực thi được.

phương pháp tiếp cận để làm

1) Sử dụng đối tượng tiếp cận theo định hướng này. Thêm phương thức của bạn vào một đối tượng và khi bạn muốn xóa nó, hãy xóa thuộc tính đó bằng cách sử dụng delete. 2) Tạo một biến chứa một hàm chứa mã của bạn để thực thi và đặt biến đó không được xác định khi bạn muốn.

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