web-dev-qa-db-fra.com

À quoi sert if (typeof window! == 'undefined')

Quel est le but d'appeler

if (typeof window !== 'undefined') 

Je l'ai vu dans JSPM plugin-css , et dans quelques autres bibliothèques.

20
YiFeng

C'est une vérification idiomatique pour voir si le script est exécuté dans une page Web à l'intérieur d'un navigateur Web ou non.

On pourrait supposer que JavaScript ne s'exécute que dans les pages Web car c'est pour cela qu'il a été conçu à l'origine, mais ce n'est pas vrai: JavaScript est un langage polyvalent qui peut également être utilisé pour écrire du code côté serveur dans Node.js ou IIS ' Pages Active Server (depuis 1996!), Ou à l'intérieur "web workers" , qui sont des scripts pour les pages Web qui s'exécutent en arrière-plan.

Dans une page Web, il existe plusieurs objets intrinsèques, tels que window, d'autres environnements (comme Node.js) n'auront pas window mais pourraient avoir d'autres objets comme console ( eh bien, console existe maintenant dans la plupart des navigateurs, mais ce n'était pas le cas à l'origine).

Par exemple, dans différents contextes, différents objets sont disponibles dans la portée globale du script (cette liste n'est pas exhaustive):

  • Dans tous les contextes JavaScript, un ensemble standard d'objets est disponible, tel que:
    • Math et Date
    • Object, Number, Function, String, etc. (objets représentant des types intégrés), etc.
  • Dans le script d'une page Web (à l'intérieur <script> Mots clés):
    • Window (interface) est exposé comme l'objet global window, qui est également l'objet qui est le global portée (déclarant ainsi var foo dans la portée globale crée en fait une propriété window.foo!)
    • Ainsi, l'objet global document accède en fait au window.document propriété.
  • Dans un script côté serveur Node.js :
    • Comme Node.js n'est pas un navigateur Web avec un DOM, il n'y a pas d'objet global window ni de propriétés comme document ou navigator, mais vous obtenez d'autres objets globaux comme :
    • console
    • process
    • exports
  • Dans le script Web Worker d'une page Web :
    • Dans un Web Worker, il n'y a pas non plus d'objet window, donc la portée globale est un objet WindowOrWorkerGlobalScope qui expose des objets via des propriétés comme:
    • caches
    • indexedDB
    • Origin
  • Dans IIS Active Server Pages utilisant JScript (au lieu de VBScript):
    • response (pour écrire dans le flux de réponse)
    • request (pour la lecture de la requête HTTP entrante)
    • Application et Session (pour la persistance des données entre les requêtes)
  • Dans l'hôte de script Shell de Microsoft Windows
    • L'objet global WScript expose les fonctionnalités du script Host.
18
Dai

Cela peut être utilisé pour détecter si le code s'exécute dans un environnement de navigateur typique (par exemple, un environnement avec un DOM de navigateur) ou dans un autre environnement JS puisque l'objet window existe dans un JS de navigateur typique, mais n'existe pas dans quelque chose comme node.js ou même un webWorker dans un navigateur.

Si l'objet window n'existe pas, alors

typeof window === 'undefined'

donc le code que vous avez demandé:

if (typeof window !== 'undefined') 

exécutera le bloc if si l'objet window existe en tant que variable de niveau supérieur.

Dans le code spécifique que vous avez lié, c'est pour éviter d'exécuter du code ciblé par navigateur qui référence des objets DOM comme document si le plugin est utilisé dans un environnement sans navigateur.

12
jfriend00