Cho rằng Plugin của tôi có thể được chạy trên bất kỳ công cụ JS (trong trình duyệt hay không),Kiểm tra xem đó là đối tượng cửa sổ
Làm sao người ta biết rằng một số biến thực sự là đối tượng trình duyệt
window
.Làm cách nào để biết liệu
someVar
có tham chiếu đến đối tượngwindow
của trình duyệt hay không. Có điều gì trong sốwindow
mà tôi có thể kiểm tra xem nó có thực sự là đối tượngwindow
của trình duyệt không?Và cách kiểm tra xem đối tượng
window
của trình duyệt có thực sự tồn tại và không chỉ một số biến sốwindow
chứa đối tượng.Giả sử bạn không thể nói nếu
someVar
làwindow
bởi chính nó, và bạn muốn kết hợp nó với các thực trình duyệtwindow
đối tượng nhưsomeVar === window
, làm thế nào để bạn có đượcwindow
rằng bạn có chắc nó là trình duyệtwindow
và không một số đối tượng khác từ phạm vi bên ngoài có tên làwindow
hoặc một số khác trên toàn cầu từ môi trường khác?
Chỉ cần làm rõ hơn một chút:
- Tôi không tìm kiếm toàn cầu của môi trường. Tôi đang tìm kiếm đối tượng
window
đối tượng cụ thể. - Tôi không kiểm tra xem tập lệnh có đang chạy trên trình duyệt hay không.
Tôi không thể làm điều gì đó như if(!window)
vì window
chỉ có thể là một đối tượng khác được khai báo ở đâu đó ngoài phạm vi.
function someFunction(){
var window = {foo:'bar'};
(function(){
console.log(window); //{foo:'bar'}
}());
}
tôi không thể kiểm tra if(window.window === window)
kể từ khi tôi cũng có thể làm tự tham khảo, và như đã nói trước đó, window
có thể là một đối tượng từ một phạm vi bên ngoài:
var bar = {};
bar.bar = bar;
bar.bar.bar.bar.bar.bar === bar; //true
Và sau đây có thể không hoạt động kể từ kịch bản có thể được bao bọc hoặc ghép lại trong một cái gì đó khác với không gian toàn cầu. this
cũng có thể được sửa đổi với các cuộc gọi như call()
, apply()
hoặc bind()
.
//Stand-alone, I can assume window is global since "this" is the global in global space
(function(window){
//window may not be window
}(this));
//But when this happens
someNamespace.someFunction = function(){
(function(window){
//window may not be window
}(this));
}
//or this:
someNamespace.someFunction.call({});
Tôi có cảm giác rằng đây là bản sao, nhưng tôi không thể tìm thấy nơi tôi lần đầu tiên nhìn thấy nó.
thể trùng lặp của [Làm cách nào để kiểm tra xem tập lệnh có đang chạy dưới node.js không?] (Http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –
Có vẻ như bạn muốn cho dù mã của bạn có đang chạy trong trình duyệt hay không bằng cách kiểm tra xem cửa sổ có tồn tại hay không. Bạn có thể thử tìm kiếm các tính năng mà trình duyệt có thể thực hiện như một phần của cửa sổ như window.location.href, nhưng tất nhiên ngay cả điều này cũng không an toàn. Làm cách nào để xác định xem bạn có thể trả lại chuỗi userAgent hợp lệ không? – series0ne
Sẽ '(function() {return this}). Gọi (null)' luôn luôn hoạt động? –