Why with() is Not Allowed in Strict Mode

Introduction

The with() statement in JavaScript allows you to temporarily extend the scope chain with an object, so you can access its properties without repeatedly referencing the object. However, it is **disallowed in strict mode** because it introduces ambiguity and potential errors. ⚠️

📌 What Happens with with()

Using with(obj) changes the scope chain temporarily. Inside the block, unqualified variables can refer either to the object’s properties or variables from an outer scope. This makes it **difficult for JavaScript engines and developers to determine which variable is being accessed**.

🧵 Example: Scope Ambiguity

Ambiguous variable resolution with with()

const x = 10;
const obj = { x: 20 };

with (obj) {
  console.log(x); // Is it 20 (obj.x) or 10 (outer x)? → ambiguous

2️⃣ Performance Issues

Because with() dynamically modifies the scope chain, JavaScript engines **cannot optimize lookups efficiently**. This leads to slower code execution and unpredictable behavior, especially in larger applications.

3️⃣ Strict Mode Restriction

Strict mode enforces cleaner, more predictable JavaScript. To prevent the ambiguity and optimization issues caused by with(), it is **completely forbidden in strict mode**. Using it will throw a SyntaxError.

🧵 Example: Strict Mode Error

with() not allowed in strict mode

"use strict";
const obj = {a: 1};

with(obj) {
  console.log(a); // ❌ SyntaxError

✅ Recommended Alternatives

Instead of with(), you can safely access object properties using:

  • Direct property access: obj.a
  • Destructuring: const {(a, b)} = obj;

Destructuring as a safe alternative

const obj = {a: 1, b: 2};
const {a, b} = obj;
console.log(a, b); // 1 2

Note

Avoiding with() ensures your code is strict-mode compliant, maintainable, and optimized.
>>"Strict mode prevents ambiguous, hard-to-debug constructs like with() — keeping your code clean and predictable." ⚡

🔥 Summary

with() is disallowed in strict mode because it introduces **scope ambiguity** and **performance issues**. Use **direct access** or **destructuring** for safe, clear, and strict-mode-compliant JavaScript.