2016-06-21 69 views
-3

使用RequireJS,在一個模塊中,是否有我可以使用this來引用模塊本身?
在requireJS模塊中使用'this'

define(function() { 
    var $el; 
    function init($el) { 
    this.$el = $el // How can 'this.$el' refer to the $el above? 
    } 
    return { 
    init: init; 
} 
}); 

我使用call調用init嘗試。即

require(["mymodule"], function(mymodule) { 
    mymodule.init.call(mymodule); 
}); 

this模塊內只是指window靜止。

有沒有辦法讓this的行爲更像它在其他語言中的行爲,即它是指封閉範圍?

目前,我必須優先考慮醜陋的模塊變量。 即

define(function() { 
     var m_$el; 
     function init($el) { 
     m_$el = $el; 
     } 
    }); 
+0

你的說法是不正確的。 'mymodule.init();'和'mymodule.init.call(mymodule);'都是相同的,如果你執行'mymodule.init()',那麼init內部的'this'指的是從該模塊,但不是「窗口」。 –

+0

'this'只能引用對象,但不能引用範圍。因此,您需要更改名稱以使它們不會相互衝突,或者需要將數據存儲在從init返回的對象中。因此,使用'this。$ el = $ el'並移除'var $ el;'或者重命名'var $ el'或參數'$ el'。 –

回答

1

你必須採取承擔init方法的對象上定義$el的護理:

define(function() { 
    function init($el) { 
    this.$el = $el; 
    } 
    return { 
    $el: undefined, 
    init: init 
    }; 
}); 
+0

我用一個更完整的例子編輯了這個問題,同意它最初不是那麼清楚。我也更喜歡使用「this.foo」來說明它指的是類/模塊上的「foo」,而「foo」指的是本地函數變量「foo」。 – Mark

+0

您的編輯對問題的實質沒有任何影響,但我編輯了我的答案。 – Louis

+0

編輯意味着在'init'函數內,'$ el'現在引用函數scoped變量。問題是:從'init'內部,如何訪問模塊範圍的'$ el'變量。也許這只是在Javascript中沒有那麼做,它是其他語言中非常標準的模式。 – Mark