The curriculum at Flatiron School jumps head first in JavaScript after several months of Ruby, Sinatra and Rails. It can be a little intimidating and overwhelming. I had a particularly tough time with the difference between self and this, but it turns out they're not so different after all!
Self in Ruby and this in JavaScript both give you access to the current object, however this behaves a little bit differently. First let's talk about Ruby's self. If self is located inside of an instance method, it refers to an instance of a class. For example:
class Owner
def walk_dogs
self.dogs {|dog| dog.mood = "happy"}
end
end
In this case, self is referring to an instance of the Owner class. We can walk all of an owner's dogs to make them happy.
We can also use self to define class level methods. This means that the method belongs to a class. Sticking with our owner theme:
class Owner
def self.dog_park
puts "I'm going to the dog park!"
end
end
Calling Owner.dog_park will output "I'm going to the dog park!"
Self is also useful in debugging and comparing objects!
Now, onto JavaScript! This can be used in global and function context.
Global Context
When we use this in the global context, it refers to the global object (window object in your browser).
this.dog = "Bark!"
console.log(window.dog);
This will log `"Bark!" into our console.
Function context is where things start to get a little bit tricky. There are several ways a function can be invoked (function, constructor, method and indirect invocation) and this works a little differently for all of them, because they each define their own context. For now, we'll just cover function and method invocation.
Function Invocation
function simple() {
console.log(this);
}
Here, this refers to our window, or global object. If we invoke simple() in our console, it will log something like this:

Method Invocation
The code below is an example of method invocation from our function context column. In the context below, this references the object that the function is being called on. Sounds familiar, right?
const owner = {
dogs: 0,
rescueDogs: function () {
return ++this.dogs;
}
}
When we call owner.rescueDogs(), we're adding to the dogs count of our owner. The rescueDogs function is a property of the owner object. This now refers to our owner object!
Constructor and Indirect invocations are a little more complicated, but we'll cover those next time!
Top comments (1)
Very nice dot! When I was young I got a tattoo of a dot on my finger as a member of secret club... now I realize I was preparing for the dot syntax! Woot.