I recently had an issue where I wanted to access the outer scope of a function, while also using the this
scope inside the function.
Often in Javascript developers will do something like
that = this
obj.doThing(function() {
that.something()
})
allowing you to access the outerscope and the inner scope. In coffeescript (and ES6) this functionality can be accessed using the =>
(fat arrow) function
obj.doThing =>
@something()
If you look at the compiled output, coffescript builds an IIFE (Immediately invoked function expression) that looks like this
obj.doThing(function(_this){
return function() {
_this.something()
}
})(this)
As you can see it binds the outer this
to _this
inside the function, replacing @
(this) with _this
As I found out though, in CS 1.9, you can’t use @
and this
in a fat arrow function because it will replace both with @
and this
with _this
but what if I want to do both like in the first example?
Well, the answer is anti-climatic, but basically I did what coffeescript does manually using the coffeescript do
block.
Which look this:
function: do (outerScope = @) ->
->
anotherFunction(@value, outerScope.get 'someValue')
of course, the bind function function.bind
or _.bind
would work here as well.