0

我正在尝试使用 CoffeeScript 中的自执行匿名函数来实现命名空间:

如何在 JavaScript 中声明命名空间?

http://enterprisejquery.com/2010/10/how-good-c-habits-can-encourage-bad-javascript-habits-part-1/

我还想保护“未定义”不被重新定义,因为这是文章所建议的。

所以在 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)不再可写”

我想知道是否有解决方法?我想保持严格模式,因为使用它可能有我不完全了解的好处。但即使谷歌搜索关闭它的方法......我想出了零。

感谢您的关注!

4

2 回答 2

2

将你的 CoffeeScript 代码包装在一个自动执行的匿名中是没有意义的——编译器默认已经完成了。

alert "Foo"

编译成

(function() {
  alert("Foo");
}).call(this);

如果要确保例如$references jQuery,只需添加一个局部变量:

$ = window.jQuery
skilett = window.skilett ? {}
# ... rest of the code ...

在使用严格模式时尝试保护也没有意义undefined,因为(如错误消息所述)undefined无论如何都是不可写的。

在“常规”模式下,您可以undefined像这样在代码顶部生成一个带有值的变量(并且只需使用它而不是“未定义”):

undef = ((u) -> u)()
于 2012-07-25T22:23:12.430 回答
1

我还想保护“未定义”不被重新定义

严格模式导致编译错误:“某些变量,如 undefined,不再可写”

那么你的问题是什么?不需要声明undefined参数,因为无论如何 CoffeeScript 都不会让你使用这个“变量”!

如果您真的(需要/想要)担心某些第三方脚本将值分配给undefined,请不要在您的代码中使用它。您始终可以使用typeof运算符或 CoffeeScripts 存在运算符。

只是别担心。我认为除了明确的恶意攻击之外,没有人遇到过这样的错误。

于 2012-07-25T22:23:07.630 回答