2010-06-12 39 views
5

Tôi đang làm việc trên nền tảng di chuyển để di chuyển các ứng dụng web từ thiết bị này sang thiết bị khác. Tôi đang mở rộng nó để thêm hỗ trợ cho việc bảo tồn trạng thái JavaScript. Tác vụ chính của tôi là tạo một tệp đại diện cho trạng thái hiện tại của ứng dụng thực thi, để truyền tải nó đến một thiết bị khác và tải lại trạng thái trong thiết bị đích.Làm cách nào để bảo toàn trạng thái đóng JavaScript?

Các giải pháp cơ bản tôi đã thông qua là để điều hướng các đối tượng cửa sổ và để lưu tất cả các thuộc tính hậu duệ của nó sử dụng JSON như là định dạng cơ sở cho xuất khẩu và mở rộng nó để thực hiện một số tính năng:

  • giữ tham chiếu đối tượng, ngay cả khi cyclic (dojox.json.ref thư viện)
  • hỗ trợ cho tính giờ
  • ngày
  • phi numericproperties của mảng
  • tham chiếu đến DOM yếu tố

nhiệm vụ quan trọng nhất tôi cần giải quyết ngay bây giờ là xuất khẩu bao đóng. Tại thời điểm này tôi không biết làm thế nào để thực hiện tính năng này. Tôi đọc về thuộc tính EcmaScript bên trong [[scope]] chứa chuỗi phạm vi của một hàm, một đối tượng giống như danh sách được tạo bởi tất cả ngữ cảnh kích hoạt lồng nhau của hàm. Rất tiếc, JavaScript không thể truy cập được. Bất cứ ai cũng biết nếu có cách nào để truy cập trực tiếp tài sản [[scope]]? Hoặc một cách khác để bảo vệ trạng thái của một đóng cửa?

+1

Không, không có cách nào tiêu chuẩn để truy cập vào '[[Phạm vi]] hiện tại', việc triển khai duy nhất cung cấp cách thức cho Rhino, thông qua thuộc tính '__parent__' của nó, ví dụ: 'var scope = function() {} .__ parent __;' – CMS

+0

Thuộc tính '__parent__' của Rhino có giống nhau do Firebug cung cấp không? –

Trả lời

2

Điều này nghe có vẻ như một kỳ tích không thể thực hiện được vì bạn sẽ cần quyền truy cập vào các tham chiếu được lưu trữ trong mỗi biến.

Giải pháp tốt nhất có thể là đầu tiên cấu trúc lại mã của bạn thành trạng thái lưu trữ trên một đối tượng có sẵn - theo cách đó bạn có thể dễ dàng sử dụng JSON.stringify/parse để lưu/khôi phục nó.

Vì vậy, đi từ

var myFuncWithScope = (function() { 
    var variable = 0; 
    return function() { 
     return variable++; 
    } 
})(); 

var serializedState = .... // no can do 

để

var state = { 
    myScope = { 
     variable: 0 
    } 
}; 

var myFuncWithoutScope = function(){ 
    return state.myScope.variable++; 
} 

var serializedState = JSON.stringify(state); 
+0

Không rõ ý bạn là "refactor mã của bạn thành trạng thái lưu trữ trên một đối tượng có sẵn" nhưng tôi nghĩ rằng đó là những gì tôi thực sự đang làm khi lưu trữ tất cả các thuộc tính 'window' trong bản đồ và chuyển bản đồ đó đến phiên bản đã sửa đổi của JSON. Những gì tôi đã yêu cầu trong bài đăng này là giải pháp cho vấn đề: "Làm thế nào tôi có thể sắp xếp một đóng và khôi phục nó trở lại thiết bị khác?" –

+0

Điểm của tôi là bạn không thể tuần tự hóa/deserialize phạm vi. Nhưng nếu tất cả các trạng thái được lưu trữ * bên ngoài * đóng cửa, như là tài sản, sau đó bạn không cần phải lưu trữ các đóng cửa vì nó chỉ có thể được tái tạo bởi kịch bản. –

+0

Giải pháp rất thú vị nhưng tôi nghĩ nó không áp dụng được cho trường hợp của tôi và việc tái cấu trúc mã nào cũng vượt xa phạm vi công việc của tôi. –

2

Từ đâu bạn thực hiện? Nếu bạn là ứng dụng gốc hoặc tiện ích mở rộng trình duyệt web, bạn có thể có một số hy vọng, thông qua quyền truy cập nội bộ vào bất kỳ công cụ tạo tập lệnh nào đang sử dụng. Nhưng từ một kịch bản trong nội dung web, không có hy vọng.

[[Scope]] là một tài sản nội bộ ECMAScript mà bạn không thể truy cập hoặc lưu giữ từ bên trong trình thông dịch, nhưng cách xa chỉ một người thông dịch; hầu hết các thuộc tính [[...]] không thể truy cập được. Tham chiếu mã chức năng, nguyên mẫu, thuộc tính, tính đếm, ngữ cảnh chủ sở hữu, trình nghe, mọi thứ cần làm với các đối tượng lưu trữ (chẳng hạn như nút DOM) ... có rất nhiều cách để thất bại.

Bạn không thể bảo vệ hoặc di chuyển ứng dụng web mà không yêu cầu họ tuân theo một số quy tắc nghiêm ngặt để tránh tất cả trừ các tính năng JS cơ bản nhất.

+0

Nền tảng có proxy di chuyển giữa máy chủ và máy khách, chặn các yêu cầu trang của khách hàng và phản hồi với một trang web được sửa đổi với một số JavaScript. Vì vậy, tôi đang thực thi từ một tập lệnh trong nội dung web. Tôi biết rất khó để di chuyển hoàn toàn trạng thái JavaScript, nhưng tôi đang cố gắng giải quyết từng bài toán con. Tôi muốn sử dụng JavaScript thuần túy vì tôi muốn làm cho nền tảng di chuyển hoạt động với mọi trình duyệt. Nhưng, nếu cần thiết, tôi có thể sử dụng một số mã phụ thuộc trình duyệt. ví dụ: Tôi đã tự hỏi làm thế nào FireBug giữ theo dõi các chuỗi phạm vi trong ngăn xếp dấu vết ... –

+0

Firebug là một phần mở rộng trình duyệt, do đó, có quyền truy cập vào trạng thái thông dịch nội bộ, bạn sẽ không thể nhìn thấy từ nội dung web. Nó không chỉ khó di chuyển hoàn toàn nhà nước, nó rõ ràng là không thể. Có một số đối tượng có trạng thái bên ngoài vì vậy chỉ đơn giản là không thể nhân bản/tuần tự/phục hồi ngay cả với quyền truy cập cấp bản địa, đừng bận tâm đến quyền truy cập hạn chế bạn nhận được từ nội dung web. – bobince

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