在自执行匿名函数中使用undefined

时间:2012-07-25 22:15:53

标签: javascript coffeescript global-variables undefined strict

我正在尝试使用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不再可写”)

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

谢谢你的期待!

2 个答案:

答案 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存在运算符。

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