2012-03-09 31 views
5

Câu hỏi này liên quan đến Javascript trong ASP cổ điển. Nó không có gì để làm với Javascript chạy trong trình duyệt.Chèn đối tượng vào phạm vi toàn cầu trong ASP/Javascript cổ điển

Một cấu trúc điển hình cho một mô-đun JS được thiết kế để được tái sử dụng được là như thế này:

(function(globalScope) { 
    ... declarations here... 
}(this)); 

này cho phép mã được gói gọn cú pháp, để cho phép kiểm tra bởi thời gian chạy phân tích cú pháp/biên dịch . Nó cũng cung cấp quản lý phạm vi, để các vars và các hàm được khai báo bên trong các curlies sẽ không hiển thị bên ngoài.

Một cấu trúc điển hình là để "xuất khẩu" một đối tượng hoặc chức năng thuộc phạm vi bên trong, với phạm vi bên ngoài, thông qua chuyển nhượng, như thế này:

(function(globalScope) { 
    var data = ['Alpha', 'Beta', 'Gamma']; 

    function helper(a) { .... } 

    function search(d) { .... } 

    // "export" a function so it is externally visible 
    globalScope.searchData = search; 

}(this)); 

// typeof this.searchData == "function" 
// typeof this.data == "undefined" 
// typeof this.helper == "undefined" 
// typeof this.search == "undefined" 

Đây là tất cả khá điển hình.

Khi sử dụng loại cấu trúc này trong ASP cổ điển (chú ý: javascript phía máy chủ !!), công cụ JS sẽ hoạt động. Tôi gặp lỗi 500.

Tại sao?

Tôi có thể sử dụng cấu trúc phạm vi và các điều "xuất" cho phạm vi toàn cầu, trong ASP cổ điển không?

Trong thời gian chạy trình duyệt, "điều này" sẽ được tính là "cửa sổ". Trong một thời gian chạy ASP cổ điển phía máy chủ, giá trị của "cái này" toàn cầu là gì? Có thể gán các thuộc tính mới cho "điều này" không?

Trả lời

2

Tôi không chắc chắn loại cơ bản là gì nhưng nó sẽ là đối tượng COM. Trừ khi đối tượng COM này triển khai IDispatchEx, bạn sẽ không thể gán các thuộc tính đơn phương cho nó. Đây là trường hợp đối với các đối tượng COM từ MSHTML làm nền tảng cho việc triển khai DHTML của Internet Explorer. Tuy nhiên nó sẽ xuất hiện rằng ASP đã không cung cấp tính năng tương tự.

Có một công việc xung quanh giả định rằng các tham số globalScope được thật sự dự kiến ​​sẽ chỉ bao giờ được phạm vi toàn cầu:

(function() { 
    var data = ['Alpha', 'Beta', 'Gamma']; 

    function helper(a) { .... } 

    function search(d) { .... } 

    // "export" a function so it is externally visible 
    searchData = search; 

})(); // Please not also small syntatic correction of your original code. 

Với caveat rằng tài sản searchData phải chưa có mặt bất cứ nơi nào lên chuỗi phạm vi. Trong trường hợp này JScript sẽ tạo ra nó ở cấp độ toàn cầu.

Tên searchData không trở thành một mục có tên trong Tập lệnh hoạt động (tức là nếu bạn cũng bao gồm một số VBScript trong cùng một trang mà VBScript cũng có thể xem searchData). Ngoài ra, this.searchData hiện đã được gán. Dường như bất kỳ đối tượng toàn cầu nào cũng cho phép độ phân giải bị ràng buộc muộn của các tên thành viên được ánh xạ tới các mục có tên trên đối tượng Active Script.

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