-
-
Save 5v3n/665319 to your computer and use it in GitHub Desktop.
sys = require 'sys' | |
#oo love: | |
class MyMath | |
square: (x) -> | |
x * x | |
cube: (x) -> | |
this.square(x) * x | |
#functional love: | |
printSquare = (number_to_process) -> | |
"square(#{number_to_process}) = #{myMath.square(number_to_process)}" #<- why does this work? myMath should be out of scope in here! | |
#let's get something rolling: | |
myMath = new MyMath | |
x = 3 | |
#mind the nice string processing: | |
sys.puts printSquare(x) | |
sys.puts "cube(#{x}) = #{myMath.cube(x)}" | |
#what's next - dynamic dispatching ;-)? |
This is how JavaScript works, I'm afraid -- all variable declarations are hoisted to the top of the current scope. printSquare
closes over myMath
, and before printSquare
runs, it's given a value. Try this code, for a clearer example of the behavior:
(function(){
var f = function(){ alert(a); };
var a = 100;
f();
})();
Thanks for the answer - I was already affraid to hear something like that ;-). So it's basically a kind of global variable - and it's initialization takes place before all the over code, right?
P.S.: Just saw that you're "The CoffeScript Guy" ;-). Awesome work so far! Being a Java dev playing with Ruby, hearing of all the great features node.js offers - CoffeScript could be the bridge between my taste of coding and these magic async features server side javascript.
I like the mix of ruby style - and feel somehow reminded of maple / mathematica function when I see square = (x) ->
.
x * x
Bottom line: I'm stoked! ;-)
Not quite -- it's not a global variable, it's just that all variable declarations effectively take place at the top of the function. For example, the following two are the same:
var f = function() {
var a;
a = 10;
call(a);
};
var f = function() {
a = 10;
call(a);
var a;
};
Alright, I see - the declaration & initialization are moved on top of the rest.
But how can the variable be accessed inside the function, if it's not global? I would expect the function to have it's own scope...
I'm a total noob concerning js, sorry for the potentially stupid question ;-).
JS has lexical scope: http://en.wikipedia.org/wiki/Scope_(programming)#Lexical_scoping
OK, dynamic scoping... if I remember that right, there's a global binding for variables in that. Reminds me of Pascal back then, now I understand.
Wonder if that's an aspect that Crockford discusses in "JS: The good Parts" ;-).
Thanks!
Having heard a lot about async node.js coolness lately, but seeing JavaScript as a bit... not that elegant, I was glad to find CoffeeScript. I'm totally stoked by CoffeeScript right now :-). But what's happening in line 10 seems a bit strange to me. Is that strange scoping a JavaScript "feature", or a CoffeeScript bug?