2014-04-06 30 views
2

我创建的CoffeeScript功能square=(x)->alert x*x
如果我写这段代码<button onclick="square(5)">编译说square()是不确定它编入这个JavaScriptCoffeeScript的功能是不明确的

(function() { 
    var square; 

    square = function(x) { 
    return alert(x * x); 
    }; 

}).call(this); 

左右。怎么了?

+0

从你的pastebin看来,'square'被封闭在关闭中,所以永远不会进入全局命名空间 –

回答

3

你的函数square必须是一个全局定义的函数,以便像你定义的那样从你的HTML中调用它。但是这块代码:

(function() { 
    var square; 

    square = function(x) { 
    return alert(x * x); 
    }; 

}).call(this); 

没有定义全局函数,因此无法找到该符号。实际上,函数平方只在您的IIFE中定义,并且在其他地方不可用。如果你想让它全局可用,您可能也只是上面块改成这样:

window.square = function(x) { 
    return alert(x * x); 
} 

或者,你可以这样做:

(function() { 
    this.square = function(x) { 
     return alert(x * x); 
    }; 
}).call(this); 

或者,显然是在CoffeeScript中,@符号是对于this.的简写,因此您可以使用此:

(function() { 
    @square = function(x) { 
     return alert(x * x); 
    }; 
}).call(this); 

甚至只是这样的:

@square = function(x) { 
    return alert(x * x); 
}; 

更多信息请参阅本其他答案:How do I define global variables in CoffeeScript?


更妙的是不使用这种调用方法。如果您使用事件侦听器,那么您不必使该函数成为全局的。

+0

,但我写了一个全局函数coffeescript,并且它被编译成匿名函数。怎么了? – user2513522

+0

@ user2513522 - 对不起,我对coffeescript了解不多,但我在回答中修改了我的建议,强制它成为全球。 – jfriend00

+0

@ user2513522 - 添加了其他几个CoffeeScript选项。 – jfriend00