使用 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')]
等等。使用您自己的名称空间可以避免全局变量,并将您限制在一小组专门清除的 类.
这是我努力实现的一个例子
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')]
等等。使用您自己的名称空间可以避免全局变量,并将您限制在一小组专门清除的 类.