How I Understood Memory Leak in JavaScript One day I wrote this small code: let user = { name: "Siddharth" }; let map = new Map(); map.set(user, "Developer"); user = null; console.log(map); And I thought: 👉 “I removed the user… so memory should be free now.” But I was wrong. 🧠 What actually happened? Even after: user = null; The object was still in memory. Why? Because Map was still holding a reference to it. 👉 JavaScript says: “As long as something is pointing to this object, I won’t delete it.” That’s called a memory leak. 💡 Human way to understand this Imagine: You throw something in the dustbin 🗑️ But someone secretly keeps a copy of it. So it’s not really gone. That’s exactly what Map does here. ⚠️ The problem If this keeps happening in a real app: • Memory keeps increasing 📈 • App becomes slow 🐢 • Eventually crashes 💥 ✅ The fix (cleanup) let user = { name: "Siddharth" }; let map = new Map(); map.set(user, "Developer"); user = null; // Cleanup map.clear(); console.log(map); // Map(0) {} Now: 👉 No reference → memory gets freed 🚀 The lesson I learned 📌 Memory leaks happen when references are not removed 📌 Map keeps strong references 📌 Always clean up unused data Now whenever I use Map, I ask: 👉 Am I removing things I no longer need? Still learning JavaScript the human way. 🚀 #JavaScript #MemoryLeak #WebDevelopment #LearningInPublic #CleanCode #ReactJS #FrontendDevelopment #DeveloperJourney #Performance
JavaScript Memory Leaks and Map Cleanup
More Relevant Posts
-
🤔 Wait… shouldn’t variables be deleted? How is it possible that a function still remembers a variable…even after the function where it was created has already finished executing? 😳 👉 Sounds impossible, right? 🚀 JavaScript’s one of the most powerful concepts: Closures 🧠 What is a Closure? A closure is created when a function is defined inside another function, and the inner function can access variables from its parent scope — even after the parent function has finished execution. ⚡Shouldn’t variables be deleted? Normally, yes ✅ 👉 Once a function finishes, its local variables are removed from memory (thanks to garbage collection) But closures change the game 👇 👉 If an inner function is still using those variables, JavaScript keeps them alive in memory 🔍 What’s really happening? The inner function “closes over” its parent’s variables 💡 That’s why it’s called a closure Even though the outer function is done… the inner function still has access to its scope 😮 🔐 Why Closures Matter (Real Use Cases) Closures aren’t just theory — they’re used everywhere: 👉 Encapsulation (Private Variables) Keep data hidden from global scope 👉 Debouncing & Throttling Control function execution (very common in React apps) 👉 State management patterns Maintain data across function calls 💡 Real Developer Insight Closures are powerful… but can be tricky 👉They can also hold memory longer than expected 👉 Misuse can lead to memory leaks 🚀 Final Thought: Most developers use closures unknowingly… But great developers understand how and why they work. #JavaScript #FrontendDevelopment #WebDevelopment #Closures #CodingTips #LearnJavaScript #BuildInPublic #100DaysOfCode #LearnInPublic
To view or add a comment, sign in
-
-
Day 16 — Memoization in JavaScript (Boost Performance) Want to make your functions faster without changing logic? 👉 Use Memoization 🚀 --- 🔍 What is Memoization? 👉 Memoization is an optimization technique where we cache results of expensive function calls and reuse them. --- 📌 Without Memoization function slowSquare(n) { console.log("Calculating..."); return n * n; } slowSquare(5); // Calculating... slowSquare(5); // Calculating again ❌ --- ⚡ With Memoization function memoize(fn) { let cache = {}; return function (n) { if (cache[n]) { return cache[n]; } let result = fn(n); cache[n] = result; return result; }; } const fastSquare = memoize((n) => { console.log("Calculating..."); return n * n; }); fastSquare(5); // Calculating... fastSquare(5); // Uses cache ✅ --- 🧠 What’s happening? 👉 First call → calculates result 👉 Next call → returns from cache 👉 No re-computation --- 🚀 Why it matters ✔ Improves performance ✔ Avoids repeated calculations ✔ Useful in heavy computations ✔ Used in React (useMemo) --- 💡 One-line takeaway: 👉 “Don’t recompute — reuse cached results.” --- If your function is slow, memoization can make it fast instantly. #JavaScript #Performance #Memoization #WebDevelopment #Frontend #100DaysOfCode
To view or add a comment, sign in
-
🧠 Day 26 — Rest vs Spread Operator in JavaScript (Simplified) Both use ... — but they do very different things 👀 --- 🔍 The Idea 👉 Spread → Expands values 👉 Rest → Collects values --- ⚡ 1. Spread Operator ... 👉 Expands elements const arr = [1, 2, 3]; const newArr = [...arr, 4]; console.log(newArr); // [1, 2, 3, 4] 👉 Also used in objects const user = { name: "John" }; const newUser = { ...user, age: 25 }; --- ⚡ 2. Rest Operator ... 👉 Collects remaining values function sum(...nums) { return nums.reduce((a, b) => a + b, 0); } sum(1, 2, 3); // 6 --- 🧠 Key Difference Spread → Expands data Rest → Gathers data --- ⚠️ Important Rule 👉 Rest must be last parameter function test(a, ...rest) {} // ✅ --- 🚀 Why it matters ✔ Cleaner code ✔ Flexible functions ✔ Used heavily in React & modern JS --- 💡 One-line takeaway: 👉 “Spread expands, Rest collects.” --- Once you understand this, working with arrays & functions becomes much easier. #JavaScript #ES6 #SpreadOperator #RestOperator #WebDevelopment #Frontend #100DaysOfCode 🚀
To view or add a comment, sign in
-
JavaScript prototypes clicked for me the moment I stopped thinking about copying and started thinking about linking. Here's the mental model that made it stick 👇 🔹 The core idea Every object in JavaScript has a hidden link to another object — its prototype. When you access a property, JS doesn't just look at the object itself. It walks the chain: Check the object Not found? Check its prototype Still not found? Check the prototype's prototype Keep going until null That's the prototype chain. Simple as that. 🔹 See it in action jsconst user = { name: "Aman" }; const admin = { isAdmin: true }; admin.__proto__ = user; console.log(admin.name); // "Aman" ✅ admin doesn't have name — but JS finds it one level up. 🔹 Why constructor functions use this jsfunction User(name) { this.name = name; } User.prototype.sayHi = function () { console.log(`Hi, I am ${this.name}`); }; Every User instance shares one sayHi method. Not copied — linked. That's free memory efficiency, built into the language. 🔹 Two things worth keeping straight prototype → a property on constructor functions __proto__ → the actual link on any object The modern, cleaner way to set that link: jsconst obj = Object.create(user); 🔹 Why bother understanding this? Because it shows up everywhere — class syntax, frameworks, unexpected undefined bugs, performance decisions. Prototypes aren't a quirk. They are the inheritance model. One line to remember: JS doesn't copy properties. It searches a chain of linked objects. #JavaScript #Frontend #WebDevelopment #Programming
To view or add a comment, sign in
-
💡 Closures & Garbage Collection in JavaScript — Not Always Perfect! We often praise closures and garbage collection as powerful features in JavaScript. But like every tool, they come with trade-offs ⚠️ Let’s break down the less talked about disadvantages 👇 🔁 Closures — Powerful but Risky Closures allow functions to remember their lexical scope even after execution. Sounds great, right? 👉 But here’s the catch: ❌ Memory leaks Closures can hold references to variables longer than needed, preventing garbage collection. ❌ Increased memory consumption Large objects captured in closures stay in memory, even if only a small part is needed. ❌ Debugging complexity Tracking variables inside nested closures can get confusing, especially in large codebases. ❌ Unintentional data retention Variables you think are gone might still exist due to closure references. 🧹 Garbage Collection — Automatic, but not Magic JavaScript automatically manages memory using garbage collection. 👉 Still, it’s not flawless: ❌ Unpredictable performance Garbage collection runs at unpredictable times, which can cause performance hiccups. ❌ Not instant cleanup Unused memory is not freed immediately — it depends on the GC cycle. ❌ Hidden memory issues Developers may ignore memory management, assuming GC handles everything. ❌ High memory usage in complex apps Frequent allocations and deallocations can strain performance. ⚖️ The Takeaway Closures and garbage collection are powerful — but misuse can lead to performance and memory issues. 👉 Write mindful code 👉 Avoid unnecessary references 👉 Keep closures lean and intentional 💬 Have you ever faced a memory leak due to closures? Let’s discuss #JavaScript #WebDevelopment #FrontendDevelopment #Closures #GarbageCollection #MemoryManagement #CleanCode
To view or add a comment, sign in
-
𝗗𝗲𝗯𝘂𝗴 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 𝗪𝗶𝘁𝗵𝗼𝘂𝘁 𝗧𝗼𝘂𝗰𝗵𝗶𝗻𝗴 𝘁𝗵𝗲 𝗖𝗼𝗱𝗲 You cannot debug minified or obfuscated JavaScript with normal breakpoints. Changing the code to add logs can break it. You need to see inside the running app without altering it. The Chrome DevTools Protocol (CDP) makes this possible. It lets you pause any function and change values on the fly. Think of it like a remote control for the browser’s engine. Here is what you can do. - Pause execution when a specific function runs. - See all arguments and local variables at that moment. - Change those arguments before the function continues. - Override the return value to test different outcomes. - Step through code selectively to avoid deep rabbit holes. This helps security researchers read scrambled code. It helps bug hunters understand hidden algorithms. It helps developers test error handling without changing the app. But CDP has clear limits. - It cannot pause for asynchronous code like Promises or async/await. The breakpoint misses the async flow. - Tracing a changed value to all its uses is guesswork. Dynamic JavaScript makes this uncertain. - Frequent pauses slow the app down. This matters for performance testing. These gaps need better tools or protocol updates. The community must build on CDP’s foundation. You can try this today. Connect to Chrome via CDP. Set a breakpoint. Inject a script. See the effect immediately. It changes how you analyze complex frontend code. Source: https://lnkd.in/ggfpKvVS
To view or add a comment, sign in
-
Using index as a key is dangerous Every React developer has written this at least once. items.map((item, index) => ( <li key={index}>{item}</li> )) Looks fine. Works fine. But it isn't This is Post 5 of the series: 𝗥𝗲𝗮𝗰𝘁 𝗨𝗻𝗱𝗲𝗿 𝘁𝗵𝗲 𝗛𝗼𝗼𝗱 Where I explain what React is actually doing behind the scenes. Here's what actually happens when you use index as key: You delete one item from a list. React doesn't know which item was removed. It just looks at positions. So it re-renders everything from that index downward. Input states get mismatched. Animations break. Bugs appear that you can't even reproduce consistently. And... No error. Just... wrong behavior. 🔑 Here's what React actually needs: A key isn't just something unique. It needs to be stable, unique, AND tied to the data — not the position. ❌ key={index} → breaks on delete, sort, filter ❌ key={Math.random()} → new key every render = React destroys and recreates the node ✅ key={item.id} → stable, reliable, React knows exactly who is who The rule is simple: If your list can ever be reordered, filtered, or deleted from... index as key will silently break your UI. Use your data's ID. If it doesn't have one, generate it at creation — not during render. const newItem = { id: crypto.randomUUID(), name: "New Task" } One tiny prop. Massive impact on how React tracks your entire list. In Post 6 of React Under the Hood: What Happens When You Call setState Follow Farhaan Shaikh if you want to understand react more deeply. 👉 Read the previous post - Understanding diffing algorithm: https://lnkd.in/dzW3NP_V #SoftwareEngineering #ReactJS #WebDevelopment #JavaScript #FrontendDevelopment #BuildInPublic #LearnInPublic #ReactUnderTheHood
To view or add a comment, sign in
-
🧠 𝗗𝗲𝗺𝘆𝘀𝘁𝗶𝗳𝘆𝗶𝗻𝗴 𝗼𝗻𝗲 𝗼𝗳 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁’𝘀 𝗺𝗼𝘀𝘁 𝗺𝗶𝘀𝘂𝗻𝗱𝗲𝗿𝘀𝘁𝗼𝗼𝗱 𝗰𝗼𝗻𝗰𝗲𝗽𝘁𝘀 In the JavaScript ecosystem, the `this` keyword consistently trips up developers—whether you're just starting out or already building production-grade apps. Instead of treating it as a “gotcha,” I decided to break it down into a structured, practical guide. ✍️ New Blog Published: 𝗨𝗻𝗱𝗲𝗿𝘀𝘁𝗮𝗻𝗱𝗶𝗻𝗴 𝘁𝗵𝗲 `𝘁𝗵𝗶𝘀` 𝗞𝗲𝘆𝘄𝗼𝗿𝗱 𝗶𝗻 𝗝𝗮𝘃𝗮𝗦𝗰𝗿𝗶𝗽𝘁 LINK: https://lnkd.in/g2USDC2Z In this article, I’ve covered: 🔹 How this behaves in different execution contexts 🔹 Differences between regular functions and arrow functions 🔹 Common pitfalls and how to avoid them 🔹 Real-world examples to make the concept stick Hitesh Choudhary Piyush Garg Chai Aur Code Anirudh J. Akash Kadlag Suraj Kumar Jha Jay Kadlag Nikhil Rathore DEV Community #JavaScript #WebDevelopment #TechnicalWriting #LearningInPublic #Chaicode
To view or add a comment, sign in
-
Most JavaScript bugs aren’t caused by complex logic. They come from choosing the wrong array method. The difference between find() and filter(), map() and forEach(), or some() and every() looks small—until it reaches production. That’s where performance, readability, and hidden bugs start to matter. Examples: filter()[0] instead of find() → unnecessary full array scan Using forEach() when map() should return transformed data → broken data pipelines Calling sort() directly in React state → silent mutation bugs Using filter().length > 0 instead of some() → extra work for no reason Overusing reduce() for simple logic → clever code, poor readability Great developers don’t just know array methods. They know: ✔ When to use them ✔ When not to use them ✔ Their performance cost ✔ Their side effects ✔ Their production impact Simple rule: Code should not only work. It should be readable, predictable, and efficient. Because in real applications, small method choices create big system behavior. The engineers I respect most don’t use reduce() to look smart. They use find() instead of filter()[0]. They spread before sort(). They know forEach() returns nothing. That’s the difference between writing JavaScript and engineering with JavaScript. #JavaScript #FrontendDevelopment #WebDevelopment #ReactJS #SoftwareEngineering #Programming #CodeQuality #TechLeadership
To view or add a comment, sign in
-
-
🚀 Memory Management in JavaScript Most developers ignore this… until their apps start lagging 😵 Let’s understand it simply 👇 🧠 What is Memory Management? 👉 How JavaScript stores and cleans memory automatically 👉 Handled by the JavaScript engine ⚡ Memory Lifecycle: 1️⃣ Allocation 👉 Memory is allocated when variables are declared 2️⃣ Usage 👉 You read / write data 3️⃣ Release 👉 Unused memory is removed 🗑️ Garbage Collection (GC) 👉 JavaScript automatically removes unreachable memory 💡 Based on: 👉 Reachability ✔ Reachable = In use ❌ Not reachable = Garbage 🧩 Example: let user = { name: "Swapnil" }; user = null; // Now object becomes unreachable 👉 Memory is cleaned automatically 🔥 Common Memory Leaks: ❌ Unused global variables ❌ Forgotten timers (setInterval) ❌ Closures holding unnecessary data ⚡ Why it matters? 👉 Prevents: ✔ Memory leaks ✔ Slow apps ✔ Crashes 💡 One line to remember: 👉 “If nothing references it, JavaScript removes it” 💬 Did you know JavaScript handles memory automatically? 📌 Save this (advanced + interview important) #javascript #webdevelopment #frontend #coding #programming #javascriptdeveloper #learncoding #developers #100DaysOfCode
To view or add a comment, sign in
-
Explore content categories
- Career
- Productivity
- Finance
- Soft Skills & Emotional Intelligence
- Project Management
- Education
- Technology
- Leadership
- Ecommerce
- User Experience
- Recruitment & HR
- Customer Experience
- Real Estate
- Marketing
- Sales
- Retail & Merchandising
- Science
- Supply Chain Management
- Future Of Work
- Consulting
- Writing
- Economics
- Artificial Intelligence
- Employee Experience
- Workplace Trends
- Fundraising
- Networking
- Corporate Social Responsibility
- Negotiation
- Communication
- Engineering
- Hospitality & Tourism
- Business Strategy
- Change Management
- Organizational Culture
- Design
- Innovation
- Event Planning
- Training & Development