2017-04-25 94 views
2

這是什麼我試着去實現一個例子使用eval來動態調用Coffeescript類安全嗎?

HTML

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

CoffeeScript的,如果它是完全安全的使用eval()這裏

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') 
) 

林不知道或是否有一個更好的方法來做到這一點?我嘗試使用window[$(this).attr('data-js-class')]但它似乎沒有工作,可能是由於使用的CoffeeScript關閉的方式。

回答

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')]和這樣。使用你自己的命名空間避免了全局變量,並將你限制在一小組專門清除的類中。