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

时间:2017-04-25 00:14:29

标签: javascript coffeescript eval

这是我想要实现的一个例子

HTML

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

的CoffeeScript

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使用闭包的方式。

1 个答案:

答案 0 :(得分:3)

您不需要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')]等。使用您自己的命名空间可以避免使用全局变量,并将您限制为一小组特别清除的类。