我正在尝试使用CoffeeScript中的自执行匿名函数实现命名空间:
How do I declare a namespace in JavaScript?
http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/
我还希望保护'undefined'不被重新定义,因为这是文章推荐的内容。
所以在CoffeeScript中,我可以做类似的事情:
((skillet, $) ->
skillet.fry ->
alert('hi');
)( window.skillet = window.skillet || {}, jQuery);
并接近文章中描述的格式:
(function(skillet, $) {
return skillet.fry(function() {
return alert('hi');
});
})(window.skillet = window.skillet || {}, jQuery);
但是当我尝试添加未定义的...时由于严格模式而出现编译错误:
http://arcturo.github.com/library/coffeescript/07_the_bad_parts.html
“某些变量(例如undefined不再可写”)
我想知道是否有解决方法吗?我想保持严格模式,因为使用它可能有好处,我并不完全清楚。但是,即使谷歌搜索关闭它的方法......我想出了零。
谢谢你的期待!
答案 0 :(得分:2)
将CoffeeScript代码包装在自动执行的匿名中是没有意义的 - 编译器默认已完成此操作。
alert "Foo"
编译成
(function() {
alert("Foo");
}).call(this);
如果你想确保例如$
引用jQuery
,只需添加一个本地变量:
$ = window.jQuery
skilett = window.skilett ? {}
# ... rest of the code ...
在使用严格模式时尝试保护undefined
也没有意义,因为(因为错误消息指出)undefined
无论如何都不可写。
当处于“常规”模式时,您可以像这样在代码顶部生成值为undefined
的变量(并简单地使用它而不是“未定义”):
undef = ((u) -> u)()
答案 1 :(得分:1)
我还希望保护'undefined'不被重新定义
和
由于严格模式导致编译错误:“某些变量(如undefined不再可写)”
那你的问题是什么?没有必要声明undefined
参数,因为CoffeeScript不会让你使用这个“变量”!
如果您确实(需要/想要)担心某些第三方脚本将值分配给undefined
,请不要在您的代码中使用它。您可以随时使用typeof
运算符或CoffeeScripts存在运算符。
不要担心。我认为除了明确的恶意攻击外,没有人遇到过这样的错误。