Top-level variables aren't globally-scoped and

2019-02-24 21:51发布

问题:

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?

回答1:

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

  • How do I define global variables in CoffeeScript?
  • Why use the javascript function wrapper (added in coffeescript) ".call(this)"
  • Getting rid of CoffeeScript's closure wrapper

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.



回答2:

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?



回答3:

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$