Cách được khuyến nghị để xử lý global object trong chế độ nghiêm ngặt ES5 trong môi trường máy chủ không xác định là gì?Nhận tham chiếu đến đối tượng toàn cục trong một môi trường không xác định ở chế độ nghiêm ngặt
ECMAScript không cung cấp cách tích hợp để tham chiếu đối tượng chung mà tôi biết. Nếu có, đây là câu trả lời tôi đang tìm kiếm.
Trong một môi trường đã biết được biết, đối tượng chung thường có thuộc tính tự tham chiếu. Kể từ khi đối tượng toàn cầu là VO cho phạm vi toàn cầu, tính chất của đối tượng toàn cầu là các biến toàn cầu, vì vậy chúng ta có thể sử dụng chúng có được một xử lý cho các đối tượng toàn cầu từ bất cứ đâu:
Trong một trình duyệt web, chúng ta có thể sử dụng
window
hoặcself
.Trong node.js, chúng tôi có thể sử dụng
global
.
Tuy nhiên, điều này không nhất thiết phải là trường hợp trong tất cả môi trường máy chủ. Theo như tôi biết, Windows Script Host không cung cấp bất kỳ cách nào để truy cập đối tượng toàn cầu. Cách được đề nghị để có được đối tượng toàn cầu trong WSH có vẻ là sử dụng từ khóa this
trong một ngữ cảnh mà nó không giải quyết cho một đối tượng. Ví dụ:
var GLOBAL = (function(){return this}());
Kỹ thuật này sẽ làm việc cho bất kỳ môi trường máy chủ, nhưng không phải trong chế độ nghiêm ngặt, bởi vì một không xác định this
không tham chiếu tới đối tượng toàn cầu trong strict mode:
Nếu đây được đánh giá trong vòng nghiêm ngặt mã chế độ, sau đó giá trị này không bị ép buộc đối tượng. Giá trị rỗng hoặc không xác định này không được chuyển đổi thành đối tượng chung và giá trị nguyên thủy không được chuyển đổi thành đối tượng bao bọc. Giá trị này được truyền qua một cuộc gọi hàm (bao gồm các cuộc gọi được thực hiện bằng Function.prototype.apply và Function.prototype.call) không ép buộc giá trị này truyền cho một đối tượng (10.4.3, 11.1.1, 15.3.4.3, 15.3. 4.4).
Đúng như dự đoán, kết quả mã sau vào undefined
:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
Vì vậy, những gì là cách thích hợp để được một xử lý cho các đối tượng toàn cầu trong bất kỳ môi trường, không phân biệt chế độ nghiêm ngặt?
Bằng cách này, cách tiếp cận hiện tại của tôi là để sniff cho các biến toàn cầu tham khảo đối tượng toàn cầu như thế này:
var self, window, global = global || window || self;
... và sau đó chỉ cần sử dụng global
. Tôi nghĩ rằng đây là một giải pháp tồi vì một số lý do, hầu hết trong số đó là khá rõ ràng, và nó không giải quyết vấn đề WSH.
bạn không thể 'sử dụng nghiêm ngặt'; (function (global) {}) (this) '? (Tôi không thử nghiệm điều này). – Marshall
Điều đó hoạt động ở Node.js, ít nhất, @Marshall –
@DavidEllis woops, đó là nền tảng lựa chọn của tôi O_o Tôi đoán tôi nên kiểm tra nó ở những người khác trước khi tôi nói bất cứ điều gì;) – Marshall