Top-level variables aren't globally-scoped and return values are mandatory in CoffeeScript

funName = () ->
  $(".foo").addClass("bar");

Compiles into the scope of an anonymous function. Calling funName from the console results in undefined.

(function() {
  var funName;
  funName = function() {
    return $(".foo").addClass("bar");
  };
}).call(this);

What's its reasoning for compiling like this and how do I work with it?

Also any insight on the mandatory return within functions using CoffeeScript would be great. Why is it like that? How do I need to code differently because of it?

Answers:

Answer

Mike has answered the main question here. The modular wrapper a common point of confusion for CoffeeScript newcomers, as illustrated by these related questions:

As to your other question: If you don't want a function to return anything, simply make the last line of that function either return by itself or, equivalently, undefined. Either will compile to a function with no return. For instance:

funName = ->
  $(".foo").addClass "bar"
  return

compiles to

var funName;
funName = function() {
  $(".foo").addClass("bar");
};

Note that there is an ongoing discussion (issue 899) about a possible alternative syntax for defining no-return functions. If the current proposal were accepted, you'd be able to write your function as

funName = -/> $(".foo").addClass "bar"

If you like that syntax, you should voice your support for it.

Answer

If you want to create a global funName try using root = exports ? this and then root.funName = ... as described at How do I define global variables in CoffeeScript?

Answer

I know this may be an older thread, but I've encountered the same problem and noticed an interesting command you can add into the compiler enviroment to fix this problem.

The command -b or --bare is used to compile the JavaScript without the top-level function safety wrapper. After I added that command when I compiled my CoffeeScript file, it removed that odd wrapper:

(function() {
    var funName;
    funName = function() {
       return $(".foo").addClass("bar");
    };
 }).call(this);

I use WebStorm as my IDE enviroment and this is my compiler statement I use:

--compile --bare $FileName$

Tags

Recent Questions

Top Questions

Home Tags Terms of Service Privacy Policy DMCA Contact Us

©2020 All rights reserved.