The JavaScript global object and scope are a key part of building apps with JavaScript. Unfortunately, they are easy to misunderstand and misuse, leading to negative impacts on your application's functionality, performance, and security.
This guide covers what the global object is, how JavaScript scopes work, and how to safely create and access global variables and functions across different environments.
What is the global object in JavaScript?
The global object in JavaScript is available to all parts of your code. Any variables or functions inside it are in the global scope, meaning they can be used in functions, nested callbacks, and modules — wherever they are.
The global object has a different name depending on your environment:
| Environment | Global object |
|---|---|
| Browser | window |
| Node.js | global |
| Web Worker |
self (or this) |
Because of this inconsistency, globalThis was introduced to provide a single, standardized way to access the global object in any environment. More on that later.
The JavaScript global scope
JavaScript scopes (also called contexts) determine where a declared variable or function is accessible. Each scope has access to variables and functions declared in its parent scopes.
When JavaScript resolves a variable name, it starts at the current scope and works upward toward the global scope. The first match it finds wins.
| Scope | Description |
|---|---|
| Global scope | Variables and functions declared outside any module, function, or block |
| Module scope | Variables and functions inside a module — isolated, not accessible from other modules |
| Function scope | Variables and functions declared inside a function — only accessible within that function |
| Block scope | Variables declared with let or const inside {} — only accessible within that block |
Note on local scope: "Local scope" is an informal term that refers to either function scope or module scope, depending on context. A variable declared inside a function is local to that function; a variable declared inside a module is local to that module.
When you should (and shouldn't) use the global object
Each JavaScript environment comes with its own built-in globals:
-
Browser —
windowexposes the DOM, alert popups,console,localStorage, geometry info, base64 utilities, and more. -
Node.js —
globalexposes module imports,process.envfor environment variables, timers, and more. - Workers — additional globals for shared scope access between the window and other workers.
These built-in globals are safe and intended to be used. Where you need to be careful is when adding your own variables to the global scope. Avoid:
- Naming a variable the same as an existing built-in global
- Storing sensitive data (like user credentials or API tokens) in globals where they could be unintentionally exposed
- Reusing variable names across scopes, which can cause a function to silently read a global instead of a local value
Over-relying on globals also has long-term costs:
- Harder to debug — globals can be modified from anywhere, making it difficult to trace unexpected values
- Memory overhead — globals persist for the lifetime of the page or process
- Namespace pollution — too many globals increases the risk of naming conflicts
The best practice is to use globals as strategically and sparingly as possible.
How to create and access global variables in JavaScript
| Scope | Set a global variable from this scope | Access a global variable from this scope |
|---|---|---|
|
Global Declared variables and functions are automatically global |
Browser: Node.js: Worker: |
Browser:
Node.js:
Worker:
|
|
Function/local/block Global variables/functions must be declared in the global object |
Browser: Node.js: Worker: |
Browser:
Node.js:
Worker:
|
|
Module Each module has its own global scope, so global variables declared in one module will not be present in another |
Within modules, global, function, and block scopes behave the same way as in other environments. Functions inside modules have their own function scope and must access the module's global scope through |
|
How to create and access global functions in JavaScript
The process for global functions mirrors global variables. Declare a function at the top level and it is automatically global:
// Declared at the top level — automatically in the global scope
function greet(name) {
return `Hello, ${name}!`;
}
console.log(greet('world')); // Hello, world!
If you are inside a function or block scope, you must explicitly attach the function to the global object:
// Browser
function setup() {
window.greet = function(name) {
return `Hello, ${name}!`;
};
}
setup();
console.log(greet('world')); // Hello, world!
// Node.js
function setup() {
global.greet = function(name) {
return `Hello, ${name}!`;
};
}
setup();
console.log(greet('world')); // Hello, world!
Watch out: Variable names and function names share the same namespace in the global scope. A
var myFunction = ...will silently overwrite afunction myFunction() {}if they share the same name.
How to use globalThis to access the global object from anywhere
With multiple JavaScript environments in play — browser windows, Node.js, web workers — accessing the global object the old way required environment-sniffing code:
// The old way — fragile and verbose
const globalObj =
typeof window !== 'undefined' ? window :
typeof global !== 'undefined' ? global :
this;
globalThis solves this by always returning the global object, regardless of where you call it from. It is now supported in all modern browsers and recent versions of Node.js.
Setting a global variable with globalThis:
// Works in browser, Node.js, and workers
globalThis.myVariable = 'foo';
Accessing a global variable with globalThis:
console.log(globalThis.myVariable); // 'foo'
Setting a global function with globalThis:
globalThis.greet = function(name) {
return `Hello, ${name}!`;
};
Accessing a global function with globalThis:
console.log(globalThis.greet('world')); // Hello, world!
globalThis works by calling this from the global scope, which always returns the global object — even when you're inside a function, a module, or a worker.
Key takeaways
- The global object (
window,global,self) holds all globally scoped variables and functions and is accessible throughout your entire codebase. - JavaScript resolves variable names by walking up the scope chain — the first match wins.
- Use built-in environment globals freely, but be strategic when adding your own.
- Over-relying on globals leads to debugging difficulties, memory overhead, and naming conflicts.
- Use
globalThisas the universal, environment-agnostic way to read and write globals. - When possible, prefer modules for sharing code rather than adding to the global scope.