Biorąc pod uwagę, że mój wtyczki mogą być uruchamiane na dowolnym silnikiem JS (w przeglądarce lub nie),Sprawdź, czy jest to obiekt okno
Skąd wiadomo, że niektóre zmienna jest faktycznie przedmiotem przeglądarka
window
.Podobnie jak wiem, czy
someVar
odnosi się do obiektu przeglądarkiwindow
. Czy jest coś takiego wwindow
, że mogę sprawdzić, czy to naprawdę obiekt przeglądarki o nazwiewindow
?A jak sprawdzić, czy obiekt przeglądarki rzeczywiście istnieje, a nie tylko niektóre zmienne
window
zawierające obiekt.Załóżmy, że nie można stwierdzić, czy
someVar
jestwindow
przez siebie, i chcesz, aby dopasować go przeciwko prawdziwy przeglądarkawindow
przedmiot jaksomeVar === window
, jak maszwindow
że jesteś pewien, że to jest przeglądarkawindow
i nie jakiś inny obiekt z zewnętrznego zakresu o nazwiewindow
lub inny obiekt globalny z innego środowiska?
Wystarczy, aby wyjaśnić nieco więcej:
- Nie szukam dla globalnego środowiska. Szukam konkretnie obiektu przeglądarki
window
. - Nie sprawdzam, czy skrypt działa w przeglądarce.
Nie mogę zrobić czegoś takiego jak if(!window)
od window
może być tylko innym obiektem zadeklarowanym gdzieś poza zakresem.
function someFunction(){
var window = {foo:'bar'};
(function(){
console.log(window); //{foo:'bar'}
}());
}
Nie mogę sprawdzić if(window.window === window)
ponieważ mogę również zrobić samo odniesienie, i jak powiedziałem wcześniej, window
mógłby być obiektem z zakresu zewnętrznej:
var bar = {};
bar.bar = bar;
bar.bar.bar.bar.bar.bar === bar; //true
I dodaje nie może działać, ponieważ skrypt może być zawijany lub łączony w coś innego niż przestrzeń globalna. this
można również zmodyfikować za pomocą wywołań takich jak call()
, lub 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({});
Mam wrażenie, że jest to duplikat, ale nie mogę znaleźć, gdzie po raz pierwszy zobaczyłem go.
możliwe duplikat [Jak sprawdzić, czy skrypt działa pod węzłem node.js?] (Http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –
Wygląda na to, że chcesz d ustal, czy kod działa w przeglądarce, czy też nie, sprawdzając, czy istnieje okno. Możesz spróbować wyszukać funkcje, które przeglądarka może zaimplementować jako część okna, takie jak window.location.href, ale oczywiście to nie jest bezpieczne. W jaki sposób określić, czy można zwrócić prawidłowy ciąg znaków userAgent? – series0ne
Czy '(function() {return this}). Call (null)' zawsze działa? –