Skip to content
DevMeme
1722 of 7435
The Never-Ending JavaScript Function Debate
Languages Post #1925, on Aug 16, 2020 in TG

The Never-Ending JavaScript Function Debate

Why is this Languages meme funny?

Level 1: Missing the Point

Imagine a teacher is trying to give you the answer to a riddle, and the answer is actually the word “this.” The teacher writes “this” on the board and points to it, saying “This is the answer.” But you, the student, think the teacher is just using the word “this” like we do in everyday speech, not as the actual answer. So you keep asking, “No, really, what’s the answer?!” and the teacher keeps pointing at the word on the board, getting more and more frustrated, shouting “This! This is the answer!” Now you’re both upset — the teacher because they feel the answer is right in front of you, and you because you feel like you’re not being told anything new. It’s a silly misunderstanding over a single word. That’s exactly what’s happening in the meme: two people are essentially arguing because one of them thinks the other isn’t answering, when in fact the answer is a tricky little word right under their nose. It’s funny (and a bit relatable) because sometimes we can be shouting the truth and still completely miss each other’s point, all because of how it’s said.

Level 2: What Is the Difference?

If you’re a newer coder scratching your head at this meme, don’t worry—JavaScript and its this keyword confuse everyone at first! The scene comes from the popular American Chopper meme template where a father and son yell at each other (usually about something ridiculous). Here, they’re arguing about arrow functions vs normal functions in JavaScript, specifically about how the word this behaves in each. The text in each panel shows their conversation: the older guy keeps saying “THIS is the difference between arrow functions and normal functions,” and the younger guy keeps shouting back “What is the difference?!” They’re talking past each other in true comedic fashion. The punchline is that the very word “this” is the answer to the question, but the poor junior developer doesn’t realize it! It’s like a classic misunderstanding where one person is giving the answer, but the other person thinks they’re still just yelling without explaining.

So, what is the difference between an arrow function and a normal function? It mostly comes down to how this works inside them. In JavaScript, this is a special keyword that refers to the “context” of the function call — basically, who or what is calling the function. For a normal function (one you declare with the function keyword or as a method), this will usually refer to the object that calls it. For example, if you have an object car with a method start() defined as a normal function, when you call car.start(), inside that function this will refer to car. However, if you just call a normal function on its own (not as a method of an object), this might end up referring to something unintended (like the global object or undefined in strict mode). This dynamic binding can lead to surprises, especially for newcomers.

Arrow functions, introduced in ES6 (2015), behave differently. An arrow function doesn’t create a new this at all. Instead, it captures the this value from the surrounding context where it’s defined. This is often described as lexical binding of this. In simpler terms, an arrow function’s this is fixed — it’s the same this as outside the function. If you use an arrow function as a method or callback, it won’t reset who this is. This can be super convenient! For instance, in older code before arrow functions, you might see something like:

const that = this;              // preserve `this` in `that`
button.addEventListener('click', function() {
    console.log(that.value);    // use preserved `this`
});

Here a developer saved this (from an outer scope) into a variable that so they could use it inside a normal function callback. Why? Because in a normal function, if used as an event handler like above, this would point to the button element (or be undefined), not the original context. Arrow functions solve this by letting us write:

button.addEventListener('click', () => {
    console.log(this.value);    // `this` is automatically taken from outer scope
});

Now this inside the arrow callback is the same this as where the callback was defined (for example, if this code is inside an object’s method, it still refers to that object). No need for the that = this trick or .bind(this) — the arrow function does it for you. This difference is exactly what our shouting match meme is about.

Let’s illustrate the difference in a straightforward way: imagine an object with a name, and two methods to print its name, one method written with a normal function and one with an arrow function:

const person = {
  name: "Alice",
  sayNameNormal: function() { console.log("Hi, I'm " + this.name); },
  sayNameArrow: () => console.log("Hi, I'm " + this.name)
};

person.sayNameNormal(); // Hi, I'm Alice  (this refers to person)
person.sayNameArrow();  // Hi, I'm undefined  (this doesn't refer to person here!)

In the above code, person.sayNameNormal() works as expected: inside that normal function, this.name is "Alice" because this equals the person object when called as a method. But person.sayNameArrow() is problematic – it prints "undefined" instead of "Alice". That’s because sayNameArrow is an arrow function, so it doesn’t care that person called it. Its this is locked to whatever context person was defined in (which in this simple case might be the global scope, where name isn’t set). This can be confusing if you didn’t realize arrow functions treat this differently.

Now, back to the meme: the older man (with the tattoos, standing up) is basically acting like a senior dev or instructor trying to hammer in this concept. He’s pointing aggressively and shouting This is the difference between arrow functions and normal functions!” He means that the keyword this is literally the key distinction. The younger man (with the cap, sitting) is like the newbie developer who isn’t getting it. He hears the word “this” as just a filler word, not realizing it refers to the this keyword in code. So he yells back “What is the difference?!” in frustration, genuinely asking for an explanation. As the panels go on, the senior just keeps repeating “THIS is the difference!” even storming out in the last frame still jabbing his finger in the air. It’s a comedic exaggeration of a teaching moment gone wrong. The poor junior is so confused that the more the senior repeats “this,” the less it makes sense to him. Meanwhile, the senior is pulling his hair out because to him it couldn’t be clearer.

For many of us, this hits home. Maybe you’ve been on one side or the other: asking a question about a weird LanguageQuirk and getting an answer that sounded like nonsense until it finally clicked, or trying to explain something like closure or this and watching the other person’s face twist up in confusion. It’s a rite of passage in learning JavaScript to struggle with this at least once! The meme uses the over-the-top argument to poke fun at just how exasperating that conversation can feel. In the end, the big takeaway (and the joke) is: the difference between arrow and normal functions is how this is treated. Once you realize that “this” in the meme isn’t just a pointer word but the actual answer, the whole thing suddenly makes sense — much like finally understanding the code concept itself.

Level 3: Bound to Confuse

This meme highlights a classic JavaScript quirk that has caused countless heated debates (hence the American Chopper shouting match). The older developer is referencing the this keyword difference between arrow functions and normal functions. It’s a pun and a frustration rolled into one: he's literally yelling that this is the difference” — meaning the keyword this is what sets the two function types apart — but the junior dev only hears a vague answer. Under the hood, an arrow function lexically binds this (it inherits the this value from its surrounding scope), whereas a traditional function sets this dynamically based on how it’s called. This nuance can be maddening in real projects: one minute this refers to your object, and the next (inside a callback or a method passed around) this is undefined or the wrong object entirely. No wonder explaining it can feel like a shouting match!

In the first panel, the older dev is essentially saying, “Look, the crucial difference between arrow and normal functions is this!” But the younger dev (seated, arms flailing) responds, “What is the difference?!,” not realizing that the word “this” isn’t just a pronoun here — it’s the answer. The humor comes from this classic misunderstanding: the word “this” is doing double duty. It’s as if a frustrated senior engineer is pointing at a code snippet yelling, “THIS right here is why your code is broken,” and the junior, still perplexed, yells back “What’s broken?!” In JavaScript terms, the senior is pointing out that an arrow function’s this is fixed to the surrounding context, while a normal function’s this depends on how you call it. But poor junior is missing that keyword entirely. This scenario is painfully familiar to many devs — trying to articulate a tricky LanguageFeature like JavaScript’s this binding can devolve into a circular argument.

To a seasoned developer, the meme evokes memories of LanguageQuirks that spark endless confusion. Before ES6 introduced arrow functions, maintaining the correct this inside callback-heavy code meant using .bind(this) or the infamous const self = this; hack. (Any veteran will shudder-laugh remembering that pattern.) Arrow functions arrived to rescue us by capturing this from the outer scope, reducing boilerplate and fron­tend frustration. Yet, ironically, explaining this improvement can be just as frustrating when someone doesn’t grok the concept. We’ve all been there: debugging a mysteriously undefined value, only to mutter “oh, it’s this again”. The meme’s exaggerated fight mirrors those exasperating sessions where a senior dev is practically flipping tables (like the older guy literally throwing a chair in panel 4) because the newbie keeps asking “But what is the difference?” even as the answer stares them in the face. In essence, it’s poking fun at how one small keyword can incite a big FrontendHumor feud.

Let’s break down the technical punchline a bit further with a quick example. Consider this object with two methods, one defined as a normal function and one as an arrow function:

const obj = { 
  data: 42,
  normalFunc: function() { console.log(this.data); },   // normal function
  arrowFunc: () => console.log(this.data)               // arrow function
};

obj.normalFunc(); // Logs 42  (this refers to obj)
obj.arrowFunc();  // Logs undefined (this is not obj here!)

In the normalFunc call, this points to obj, so it prints 42. In arrowFunc, this doesn’t point to obj at all – it was lexically bound to whatever this was outside obj (likely the global scope or undefined in strict mode), causing this.data to be undefined. That right there is the difference the older dev is screaming about. It’s a simple concept once it “clicks,” but before it does, explaining it can feel like you’re just shouting the same word over and over. The meme nails this absurdity by turning the explanation into a literal shouting match. The senior engineer (like Paul Sr. in the meme) is technically correct — the best kind of correct — but communication has broken down in a cascade of “THIS!” vs “WHAT?!”. Any experienced dev who’s tried to mentor someone through JavaScript’s odd scoping rules can relate, likely chuckling (or cringing) at how accurately this meme captures that DeveloperHumor moment.

Description

This meme uses the five-panel 'American Chopper Argument' format to humorously depict a heated debate between two developers. In the first panel, the senior figure, Paul Teutul Sr., asserts, 'THIS IS THE DIFFERENCE BETWEEN ARROW FUNCTIONS AND NORMAL FUNCTIONS'. His son, Paul Jr., retorts in the second panel, 'WHAT IS THE DIFFERENCE'. The argument escalates with both characters yelling the same phrases at each other, culminating in Paul Jr. throwing a chair in frustration. The final panel shows Paul Sr. pointing aggressively, still insisting, 'THIS IS THE DIFFERENCE'. The humor stems from the passionate, almost circular arguments developers have about nuanced language features. For JavaScript developers, the difference between arrow and regular functions (primarily lexical 'this' binding) is a fundamental concept, but one that can cause significant confusion and debate, making this meme highly relatable

Comments

7
Anonymous ★ Top Pick The main difference is `this`. An arrow function captures `this` from its surrounding context, while a normal function's `this` is determined by how it's called. Or as I like to call it, the difference between predictable behavior and 'why is `this` the window object again?'
  1. Anonymous ★ Top Pick

    The main difference is `this`. An arrow function captures `this` from its surrounding context, while a normal function's `this` is determined by how it's called. Or as I like to call it, the difference between predictable behavior and 'why is `this` the window object again?'

  2. Anonymous

    Arrow function’s `this` is a read-only Kubernetes mount - fixed at deploy time; regular function’s `this` is a shared mutable global you only discover after someone’s already throwing chairs in prod

  3. Anonymous

    After 15 years in the industry, you realize the real difference between arrow functions and normal functions is how many junior developers you'll need to explain lexical 'this' binding to during code reviews versus how many will accidentally break the prototype chain trying to be clever with arrow function class methods

  4. Anonymous

    This perfectly captures every Stack Overflow answer about arrow functions: 'The difference is that arrow functions handle `this` differently.' 'But HOW?' 'They handle `this` differently!' Meanwhile, the real answer - lexical binding vs dynamic binding, no `arguments` object, can't be constructors - remains lost in the shouting match. It's the technical equivalent of 'it works because it works,' and we've all been both people in this conversation at 2 AM debugging a callback hell

  5. Anonymous

    Teams standardize on arrow functions so code reviews stop debating why a callback lost this and whether to fix it with bind, call, apply, or a flying chair

  6. Anonymous

    Arrow vs function in JS: one lexically adopts this; the other negotiates custody at runtime via call/apply/bind - React class components were the divorce

  7. Anonymous

    Arrow functions: lexical 'this' so predictable, unlike the dynamic 'this' in normal functions that ghosts you mid-closure

Use J and K for navigation