使用 eval 动态调用 Coffeescript class 是否安全?

Is it safe to use eval to dynamically call Coffeescript class?

这是我努力实现的一个例子

HTML

<div data-js-class="Header"></div>

咖啡脚本

class Header
  constructor: (@root) ->
    # Header related code here


$('[data-js-class]').each(->
  unless $(this).attr('data-js-loaded') == 'true'
    partial_class = eval($(this).attr('data-js-class'))
    if typeof partial_class != "undefined"
      new partial_class($(this))
      $(this).attr('data-js-loaded', 'true')
)

我不确定在这里使用 eval() 是否完全安全,或者是否有更好的方法?我尝试使用 window[$(this).attr('data-js-class')] 但它似乎没有用,可能是由于 Coffeescript 使用闭包的方式。

您不需要 eval,您的 window[...] 方法是正确的。使用 window 作为命名空间的问题是:

class Header
  constructor: (@root) ->
    # Header related code here

变成(或多或少)这个:

(function() {
  var Header = ...
}).call(this);

所以您只能使用局部 Header 变量而不是全局 window.Header 变量。您可以使 Header 全局化:

class @Header
  #---^
  constructor: (@root) ->
    # Header related code here

然后你的 window[$(this).attr('data-js-class')] 技巧就会奏效。

或者更好 (IMO),为这些 类:

创建你自己的命名空间
dynamics = { }
class dynamics.Header
  #...
class dynamics.Footer
  #...

然后你可以说 new dynamics[$(@).data('js-class')] 等等。使用您自己的名称空间可以避免全局变量,并将您限制在一小组专门清除的 类.