Day 43/50 – JavaScript Interview Question? Question: What is Event Loop, Call Stack, and Task Queue in JavaScript? Simple Answer: The Call Stack tracks function execution (LIFO). The Task Queue (Callback Queue) holds callbacks from async operations. The Event Loop continuously checks if the Call Stack is empty, then moves tasks from the queue to the stack. Microtasks (Promises) have priority over Macrotasks (setTimeout). 🧠 Why it matters in real projects: Understanding the Event Loop is crucial for debugging async behavior, preventing UI blocking, and optimizing performance. It explains why promises execute before setTimeout(0), and helps you write non-blocking code in a single-threaded environment. 💡 One common mistake: Not understanding microtask vs macrotask priority, leading to unexpected execution order. Also, creating infinite microtask loops that starve the macrotask queue and freeze the UI. 📌 Bonus: // Example demonstrating execution order console.log('1: Sync Start'); setTimeout(() => { console.log('2: setTimeout (Macrotask)'); }, 0); Promise.resolve().then(() => { console.log('3: Promise 1 (Microtask)'); }).then(() => { console.log('4: Promise 2 (Microtask)'); }); console.log('5: Sync End'); // Output: // 1: Sync Start // 5: Sync End // 3: Promise 1 (Microtask) // 4: Promise 2 (Microtask) // 2: setTimeout (Macrotask) // Event Loop phases: // 1. Execute all synchronous code // 2. Execute all microtasks (Promises, queueMicrotask) // 3. Execute one macrotask (setTimeout, setInterval, I/O) // 4. Repeat // Call Stack visualization function first() { console.log('First'); second(); console.log('First again'); } function second() { console.log('Second'); third(); } function third() { console.log('Third'); } first(); // Stack: [first] → [first, second] → [first, second, third] // Output: First, Second, Third, First again // Microtask vs Macrotask setTimeout(() => console.log('Macro 1'), 0); Promise.resolve() .then(() => { console.log('Micro 1'); Promise.resolve().then(() => console.log('Micro 2')); }) .then(() => console.log('Micro 3')); setTimeout(() => console.log('Macro 2'), 0); // Output: Micro 1, Micro 2, Micro 3, Macro 1, Macro 2 // All microtasks complete before next macrotask! // Blocking the Event Loop (BAD!) function blockingOperation() { const start = Date.now(); while (Date.now() - start < 3000) { // Blocks for 3 seconds - UI freezes! } } // Better: Break into chunks async function nonBlockingOperation() { for (let i = 0; i < 1000; i++) { // Do work... if (i % 100 === 0) { await new Promise(resolve => setTimeout(resolve, 0)); // Yields to Event Loop every 100 iterations } } } // Microtask starvation (infinite loop) function starveEventLoop() { Promise.resolve().then(() => { starveEventLoop(); // Creates endless microtasks! // Macrotasks never run - UI freezes }); }
Understanding JavaScript Event Loop, Call Stack, and Task Queue
More Relevant Posts
-
🚀 JavaScript Objects – Interview Q&A (Frontend Focused) 1️⃣ What is an object in JavaScript? An object is a collection of key–value pairs used to store structured data. Keys are strings (or symbols), and values can be any data type. 2️⃣ How do you create an object in JavaScript? // Object literal const obj = { name: "JS" }; // Using constructor const obj2 = new Object(); // Using Object.create const obj3 = Object.create(null); 3️⃣ How do you access object properties? obj.name; // Dot notation obj["name"]; // Bracket notation 👉 Bracket notation is useful for dynamic keys. 4️⃣ Difference between dot notation and bracket notation? DotBracketStatic keysDynamic keysFaster & cleanerRequired for special characters 5️⃣ How do you loop through an object? for (let key in obj) { console.log(key, obj[key]); } Object.keys(obj).forEach(key => console.log(key)); 6️⃣ What are Object.keys(), Object.values(), and Object.entries()? Object.keys() → array of keys Object.values() → array of values Object.entries() → array of [key, value] 7️⃣ Are objects mutable in JavaScript? ✅ Yes. Objects are mutable and passed by reference. const a = { x: 1 }; const b = a; b.x = 2; // a.x is also 2 8️⃣ How do you clone an object? // Shallow copy const copy = { ...obj }; const copy2 = Object.assign({}, obj); ⚠️ Nested objects still share references. 9️⃣ Difference between shallow copy and deep copy? Shallow copy → Copies only first level Deep copy → Copies all nested levels const deep = JSON.parse(JSON.stringify(obj)); 🔟 What is this inside an object? this refers to the current object calling the method. const user = { name: "Sweta", greet() { return this.name; } }; 1️⃣1️⃣ What is object destructuring? const { name, role } = user; Used for cleaner code and readability. 1️⃣2️⃣ What is the difference between Object.freeze() and Object.seal()? freeze() → Cannot add, remove, or update properties seal() → Can update existing properties only 1️⃣3️⃣ How do you check if a property exists? "name" in user; user.hasOwnProperty("name"); 1️⃣4️⃣ Real-world use of objects? ✅ API responses ✅ Component props & state ✅ Configuration files ✅ Form handling ✅ State management (Redux / Pinia) 💡 Interview Tip: Strong understanding of objects helps you master immutability, state management, and performance optimization in React & Vue. 👍 Like • 💬 Comment • 🔁 Share if this helped #JavaScript #FrontendInterview #WebDevelopment #React #Vue #CodingInterview #LinkedInLearning
To view or add a comment, sign in
-
Day 45/50 – JavaScript Interview Question? Question: What is the difference between call(), apply(), and bind()? Simple Answer: All three set the this context explicitly. call(thisArg, arg1, arg2, ...) invokes immediately with individual arguments. apply(thisArg, [args]) invokes immediately with an array of arguments. bind(thisArg) returns a new function with this permanently bound, without invoking. Why it matters in real projects: These methods are essential for method borrowing, event handlers with correct context, React class component methods, and functional programming patterns. Understanding them prevents common this binding bugs and enables powerful composition techniques. One common mistake: Confusing when to use each method. Use call when you know arguments, apply when you have an array, and bind when you need a reusable function with fixed context. Also, forgetting that arrow functions can't have their this rebound. Bonus: const person = { name: 'Alice', greet(greeting, punctuation) { console.log(`${greeting}, ${ this.name }${punctuation}`); } }; const person2 = { name: 'Bob' }; // call() - invoke immediately with individual args person.greet.call(person2, 'Hello', '!'); // "Hello, Bob!" // apply() - invoke immediately with array person.greet.apply(person2, ['Hi', '?']); // "Hi, Bob?" // bind() - return new function (doesn't invoke) const greetBob = person.greet.bind(person2); greetBob('Hey', '.'); // "Hey, Bob." // Practical use cases: // 1. Method borrowing const arrayLike = { 0: 'a', 1: 'b', length: 2 }; const arr = Array.prototype.slice.call(arrayLike); console.log(arr); // ['a', 'b'] // Modern alternative const arr2 = Array.from(arrayLike); // 2. Finding max/min with apply const numbers = [5, 2, 9, 1, 7]; const max = Math.max.apply(null, numbers); // 9 // Modern alternative const max2 = Math.max(...numbers); // 3. Event handlers with correct context class Button { constructor(label) { this.label = label; this.clicks = 0; } handleClick() { this.clicks++; console.log(`${this.label}: ${this.clicks} clicks`); } render() { const btn = document.createElement('button'); // ✗ Wrong - loses context btn.addEventListener('click', this.handleClick); // ✓ Right - preserves context btn.addEventListener('click', this.handleClick.bind(this)); } } // 4. Partial application with bind function multiply(a, b) { return a * b; } const double = multiply.bind(null, 2); console.log(double(5)); // 10 console.log(double(10)); // 20 // 5. Function composition function add(x, y) { return x + y; } const add5 = add.bind(null, 5); const result = [1, 2, 3].map(add5); // [6, 7, 8] // Polyfill for bind (interview favorite) Function.prototype.myBind = function(context, ...args) { const fn = this; return function(...newArgs) { return fn.apply(context, [...args, ...newArgs]); }; }; // Arrow functions can't be rebound const arrowFunc = () => { console.log(this.name); }; const obj = { name: 'Test' }; arrowFunc.call(obj); // Won't bind 'this' to obj!
To view or add a comment, sign in
-
Event Delegation Sounds simple yet it is a powerful technique in JavaScript. To learn about it, we need to know about the concept of 'Event Bubbling". 'Event Bubbling' is a JavaScript process where an event triggered on a DOM element propagates upward through its ancestors in the DOM tree until it reaches the root i.e. the document or window. While moving upwards it triggers the event handlers on each parent element. When an event occurs, 3 phases are completed. First happens the "Event Capturing" phase where the event starts from the very root and continues to propagate through all the DOM elements one by one until the target element is found. During phase two, the event reaches the target element and executes its event handler. Afterwards, phase three happens which is 'Event Bubbling' - here the event propagates upward through the ancestor elements one by one toward the root and triggers their handlers too. This is a default behavior in JS and can be stopped using `e.stopPropagation()` where 'e' is the event. Let's get back to our topic. Event delegation is a technique in JavaScript where instead of attaching event listeners to multiple child elements individually, a single event listener is attached to the common parent element that contains the child elements. As a result, when an event of a child will eventually propagate upward during the event bubbling phase, the parent can capture & handle it. Examples: • Without Event Delegation ❌ `const buttons = document.querySelectorAll(".task-btn"); buttons.forEach((button) => { button.addEventListener("click", function () { alert("You clicked " + button.textContent); }); });` • With Event Delegation ✅ `const taskList = document.getElementById("taskList"); taskList.addEventListener("click", function (event) { if (event.target.classList.contains("task-btn")) { alert("You clicked " + event.target.textContent); } });` 💡 e.target = the actual clicked element (child) 💡 e.currentTarget = the element the listener is attached to (parent) Now, you might wonder - "What's the problem in attaching event listeners to every child element individually?" Well, there are several issues due to this approach. Attaching event listeners to many elements can hurt performance because each element gets its own handler. `document.querySelectorAll(".item").forEach(item => item.addEventListener("click", handleClick));` This increases memory usage and event processing. It also fails when elements are later added dynamically: `const item = document.createElement("div"); item.className="item"; document.body.appendChild(item);` Since listeners were attached earlier, this new element doesn't get any. It also leads to repetitive code like: `btn1.addEventListener("click", fn); btn2.addEventListener("click", fn);` Therefore, event delegation solves these issues by attaching one listener to the parent, and utilizing event bubbling. This keeps the code cleaner and works for both existing and future elements.
To view or add a comment, sign in
-
-
here's some important JavaScript questions to crack interviews 𝟭. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝘁𝗵𝗶𝘀 𝗸𝗲𝘆𝘄𝗼𝗿𝗱? - Refers to the object that is currently executing the function - In global scope, this is the window object (in browsers) - Arrow functions do not have their own this 𝟮. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗣𝗿𝗼𝘁𝗼𝘁𝘆𝗽𝗮𝗹 𝗜𝗻𝗵𝗲𝗿𝗶𝘁𝗮𝗻𝗰𝗲? - JS objects inherit properties and methods from other objects via a prototype chain - Every object has a hidden __proto__ property pointing to its prototype - ES6 class syntax is just cleaner syntax over prototypal inheritance 𝟯. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝘁𝗵𝗲 𝗦𝗽𝗿𝗲𝗮𝗱 𝗮𝗻𝗱 𝗥𝗲𝘀𝘁 𝗢𝗽𝗲𝗿𝗮𝘁𝗼𝗿 (...)? - Spread expands an array or object: const newArr = [...arr, 4, 5] - Rest collects remaining arguments into an array: function fn(a, ...rest) {} - Same syntax, different context position determines behavior - Great for copying arrays/objects without mutation 𝟰. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗗𝗲𝘀𝘁𝗿𝘂𝗰𝘁𝘂𝗿𝗶𝗻𝗴? - Extract values from arrays or objects into variables cleanly - Array: const [first, second] = [1, 2] - Object: const { name, age } = user - Supports default values: const { name = 'Guest' } = user 𝟱. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗘𝘃𝗲𝗻𝘁 𝗗𝗲𝗹𝗲𝗴𝗮𝘁𝗶𝗼𝗻? - Instead of adding listeners to each child element, add one listener to the parent - Uses event bubbling events travel up the DOM tree - More memory efficient for large lists or dynamic content - Check event.target inside the handler to identify which child was clicked 𝟲. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝘁𝗵𝗲 𝗱𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝗰𝗲 𝗯𝗲𝘁𝘄𝗲𝗲𝗻 𝗰𝗮𝗹𝗹(), 𝗮𝗽𝗽𝗹𝘆()? - All three explicitly set the value of this - call() invokes immediately, passes args one by one - apply() invokes immediately, passes args as an array 𝟳. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗠𝗲𝗺𝗼𝗶𝘇𝗮𝘁𝗶𝗼𝗻? - Caching the result of a function call so it doesn't recompute for the same input - Improves performance for expensive or repeated operations - Commonly implemented using closures and objects/Maps 𝟴. 𝗪𝗵𝗮𝘁 𝗮𝗿𝗲 𝗛𝗶𝗴𝗵𝗲𝗿-𝗢𝗿𝗱𝗲𝗿 𝗙𝘂𝗻𝗰𝘁𝗶𝗼𝗻𝘀? - Functions that take other functions as arguments or return them - Examples: .map(), .filter(), .reduce(), .forEach() - Core concept in functional programming with JavaScript 𝟵. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝘁𝗵𝗲 𝗱𝗶𝗳𝗳𝗲𝗿𝗲𝗻𝗰𝗲 𝗯𝗲𝘁𝘄𝗲𝗲𝗻 𝗗𝗲𝗲𝗽 𝗖𝗼𝗽𝘆 𝗮𝗻𝗱 𝗦𝗵𝗮𝗹𝗹𝗼𝘄 𝗖𝗼𝗽𝘆? - Shallow copy copies only the top level nested objects are still referenced - Object.assign() and spread {...obj} create shallow copies - Deep copy duplicates everything including nested levels 𝟭𝟬. 𝗪𝗵𝗮𝘁 𝗶𝘀 𝗼𝗽𝘁𝗶𝗼𝗻𝗮𝗹 𝗰𝗵𝗮𝗶𝗻𝗶𝗻𝗴 (?.) 𝗮𝗻𝗱 𝗻𝘂𝗹𝗹𝗶𝘀𝗵 𝗰𝗼𝗮𝗹𝗲𝘀𝗰𝗶𝗻𝗴 (??)? - ?. safely accesses nested properties without throwing if something is null/undefined - user?.address?.city returns undefined instead of crashing - ?? returns the right side only if the left is null or undefined Follow the Frontend Circle By Sakshi channel on WhatsApp: https://lnkd.in/gj5dp3fm 𝗙𝗼𝗹𝗹𝗼𝘄𝘀 𝘂𝘀 𝗵𝗲𝗿𝗲 → https://lnkd.in/geqez4re
To view or add a comment, sign in
-
🚀 JavaScript Interview Prep Series — Day 29 Topic: Bundlers & Modules in JavaScript Continuing my JavaScript interview journey, today I revised a very practical frontend concept: 👉 Modules and Bundlers Modern JavaScript apps are built using many small files (modules). Bundlers help package them efficiently for the browser. 🧳 Real-World Example: Packing for a Trip Imagine you're traveling. Before Bundling ❌ You have many small bags: toiletries bag shoe bag electronics bag clothes bag Hard to carry. Messy. Slow. 👉 These are like separate JS modules Bundler at Work ⚙️ A smart packing machine: analyzes items removes duplicates compresses everything organizes efficiently 👉 This is Webpack / Vite / Rollup After Bundling ✅ You get: 🧳 One optimized suitcase 🚀 Easy to carry ⚡ Faster travel 👉 This is bundle.js 💻 Step 1: Create Modules math.js id="x6a7bg" export const add = (a, b) => a + b; export const multiply = (a, b) => a * b; utils.js id="y9k2hf" export const format = (str) => str.trim(); 💻 Step 2: Import in App id="bq9x0u" import { add, multiply } from "./math.js"; import { format } from "./utils.js"; console.log(add(5, 3)); 👉 Code is modular and clean. ⚙️ Step 3: Bundler Magic Bundlers like: Webpack Vite Rollup will: ✅ Merge modules ✅ Remove unused code (tree shaking) ✅ Minify code ✅ Optimize for browser ✅ Reduce HTTP requests 📦 Final Output Id="tju5y3" // bundle.js // One optimized file ready for production This is what browsers typically load in production. 🎯 Why Interviewers Ask This Because it tests: • Modern frontend workflow • Build tool understanding • Performance awareness • Module system knowledge ⚡ When Bundlers Are Important ✔ React / Next.js apps ✔ Large JavaScript projects ✔ Production builds ✔ Performance optimization ✔ Code splitting setups 🧠 Pro Tips ✅ Use ES Modules (import/export) ✅ Prefer Vite for modern projects ✅ Enable tree-shaking ✅ Keep bundles small ✅ Use code splitting when needed 📌 Goal: Share daily JavaScript concepts while preparing for interviews and learning in public. Next topics: Code Splitting, Lazy Loading, and advanced performance patterns. Let’s keep the momentum strong 🚀 #JavaScript #InterviewPreparation #Bundlers #Webpack #Vite #Frontend #WebDevelopment #LearningInPublic #Developers
To view or add a comment, sign in
-
-
Day 49/50 – JavaScript Interview Question? Question: What is the difference between stopPropagation(), stopImmediatePropagation(), and preventDefault()? Simple Answer: stopPropagation() prevents event from bubbling/capturing to other elements. stopImmediatePropagation() also prevents other handlers on current element. preventDefault() cancels default browser action but doesn't stop propagation. 🧠 Why it matters in real projects: These control event behavior in complex UIs with nested elements. Misusing them causes bugs like forms not submitting, clicks triggering parent handlers, or custom behavior failing. Critical for proper event handling. 💡 One common mistake: Using stopPropagation() everywhere "to be safe" breaks event delegation patterns. Also confusing preventDefault() with stopping propagation—they serve different purposes. 📌 Bonus: // HTML: <div id="outer"><button id="inner">Click</button></div> const outer = document.getElementById('outer'); const inner = document.getElementById('inner'); // stopPropagation() - stops event flow inner.addEventListener('click', (e) => { console.log('Inner'); e.stopPropagation(); // Stops here! }); outer.addEventListener('click', () => { console.log('Outer'); // Won't fire }); // stopImmediatePropagation() - stops all handlers inner.addEventListener('click', (e) => { console.log('Handler 1'); e.stopImmediatePropagation(); }); inner.addEventListener('click', () => { console.log('Handler 2'); // Won't fire! }); // preventDefault() - cancels default action const link = document.querySelector('a'); link.addEventListener('click', (e) => { e.preventDefault(); // Link won't navigate // Event still propagates to parent! }); const form = document.querySelector('form'); form.addEventListener('submit', (e) => { e.preventDefault(); // Form won't submit handleAjaxSubmit(new FormData(form)); }); // Practical: Modal overlay modal.addEventListener('click', (e) => { e.stopPropagation(); // Clicks on modal don't close it }); overlay.addEventListener('click', () => { closeModal(); // Clicks on overlay close it }); // Best practice: Don't break delegation document.querySelector('.list').addEventListener('click', (e) => { if (e.target.matches('.item')) { // Don't use stopPropagation here! handleItemClick(e.target); } }); #JavaScript #WebDevelopment #Frontend #LearnInPublic #InterviewQuestions #Programming #TechInterviews #Events #EventPropagation #WebDev #DOM
To view or add a comment, sign in
-
*🚀 JavaScript Closures 🔥* Closures are a fundamental concept in JavaScript, often asked in interviews. A closure is when a function remembers variables from its outer scope, even after the outer function has finished executing. *🔹 1. Basic Example of Closure* function outer() { let count = 0; function inner() { count++; console.log(count); } return inner; } const counter = outer(); counter(); // 1 counter(); // 2 counter(); // 3 The inner function remembers the `count` variable even after the outer function has finished executing. *🔹 2. Why Closures Work* Because of lexical scope, inner functions can access their own variables, parent function variables, and global variables, even after the parent function ends. *🔹 3. Closures for Data Privacy (Very Important)* Closures help protect data. function createBankAccount() { let balance = 1000; return function(amount) { balance += amount; console.log(balance); } } const account = createBankAccount(); account(500); // 1500 account(200); // 1700 The `balance` variable is private and cannot be accessed directly. *🔹 4. Real-World Use Cases* Closures are used in: ✅ Data hiding / encapsulation ✅ Callbacks ✅ Event handlers ✅ setTimeout / async code ✅ Functional programming *Double Tap ❤️ For More*
To view or add a comment, sign in
-
🚀 JavaScript Interview Questions & Real-World System Design Insights Recently, I was preparing for backend/full-stack interviews and thought of sharing some commonly asked JavaScript + system design questions with practical answers 👇 🟢 1️⃣ Function to Capitalize Each Word in a Sentence Question: Write a function to capitalize every word in a sentence. Answer: function capitalizeSentence(sentence) { return sentence .split(" ") .map(word => word.charAt(0).toUpperCase() + word.slice(1)) .join(" "); } console.log(capitalizeSentence("hello world from javascript")); // Output: Hello World From Javascript 💡 Interview Tip: Ask about edge cases (multiple spaces, empty string, special characters). Mention immutability and time complexity → O(n) 🟢 2️⃣ Function to Find Missing Number Question: Find the missing number in an array from 1 to n. Example: [1,2,3,5] → Missing number = 4 Answer (Using Sum Formula - Optimized O(n)): function findMissingNumber(arr, n) { const expectedSum = (n * (n + 1)) / 2; const actualSum = arr.reduce((sum, num) => sum + num, 0); return expectedSum - actualSum; } console.log(findMissingNumber([1,2,3,5], 5)); // Output: 4 💡 Follow-up they might ask: What if array is unsorted? What if there are duplicates? Can you solve using XOR? 🌍 Real-World Backend/System Design Questions 🟠 3️⃣ What About Security If Anyone (Even Bots) Can Hit Your Website? This is a very practical production question. ✅ Solutions you should mention: Rate Limiting (e.g., Redis-based limiter) CAPTCHA for public forms WAF (Web Application Firewall) Input validation & sanitization JWT authentication & role-based authorization API throttling DDoS protection (Cloudflare/AWS Shield) 💡 Bonus Point: Explain difference between Authentication vs Authorization. 🟠 4️⃣ How Do We Scale If We Don’t Know How Traffic Will Increase? This tests architecture thinking. ✅ Smart answer: Horizontal scaling (multiple instances) Load balancer (Nginx / cloud LB) Stateless servers Caching layer (Redis) Database indexing + read replicas Auto-scaling groups (cloud-based scaling) Queue systems for heavy jobs (Kafka/RabbitMQ) 💡 Golden Line for Interview: “Design for scalability from day one, even if traffic is low.” 🔥 Interviews today are not just about syntax. They test: Problem-solving System thinking Production mindset Edge cases awareness If you're preparing for JavaScript / Node.js / Full Stack interviews, focus on both coding + architecture. Let me know if you want more real interview Q&A posts 👇 #JavaScript #NodeJS #FullStackDeveloper #FrontendDeveloper #BackendDeveloper #WebDevelopment #CodingInterview #TechInterview #SystemDesign #Scalability #WebSecurity #SoftwareEngineering #DeveloperLife
To view or add a comment, sign in
-
*🚀 JavaScript Closures 🔥* Closures are a fundamental concept in JavaScript, often asked in interviews. A closure is when a function remembers variables from its outer scope, even after the outer function has finished executing. *🔹 1. Basic Example of Closure* function outer() { let count = 0; function inner() { count++; console.log(count); } return inner; } const counter = outer(); counter(); // 1 counter(); // 2 counter(); // 3 The inner function remembers the `count` variable even after the outer function has finished executing. *🔹 2. Why Closures Work* Because of lexical scope, inner functions can access their own variables, parent function variables, and global variables, even after the parent function ends. *🔹 3. Closures for Data Privacy (Very Important)* Closures help protect data. function createBankAccount() { let balance = 1000; return function(amount) { balance += amount; console.log(balance); } } const account = createBankAccount(); account(500); // 1500 account(200); // 1700 The `balance` variable is private and cannot be accessed directly. *🔹 4. Real-World Use Cases* Closures are used in: ✅ Data hiding / encapsulation ✅ Callbacks ✅ Event handlers ✅ setTimeout / async code ✅ Functional programming
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