2011-05-31 54 views
18

我有一些JavaScript代碼(在對象中):JavaScript的匿名函數的參數傳遞

toggle: function() { 
    var me = this; 
    var handler = function() { me.progress() }; 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 

我有點新的JavaScript,這樣上面的,據我可以告訴實際上經過me變量變成匿名的功能。我想看看是否有更具說明性的方式來做到這一點?我想沿線的東西:

var handler = (function(o) { o.progress();})(this)); 

但這似乎並沒有工作......我錯過了什麼嗎?這是「這是語言的工作方式,所以只聲明一個局部變量並處理它」?

UPDATE:

源到我的問題是/是我在JavaScript範圍和封閉不清楚的理解。我發現this article幫助我瞭解更多。

+1

它不工作,因爲你有一個')'太多。不是'var handler =(function(o){o.progress();})(this);'也許工作? – pimvdb 2011-05-31 14:12:54

回答

26

您可以使用「.bind()」:

var handler = function() { this.progress(); }.bind(this); 

新的瀏覽器都有‘綁定()’,和Mozilla docs有你可以用它來修補舊的瀏覽器了堅實的實現。

+3

我的情況更簡潔的解決方案是'var handler = this.progress.bind(this)'。感謝您的輸入! – Jose 2011-06-13 13:12:38

+0

哦,當然:-)好點。 – Pointy 2011-06-13 13:14:55

1

你在那裏有一個封閉。創建並分配給handler的功能保留對me對象的引用。這是普通的日常JavaScript,這就是封閉式工作的一般方式。

+1

那不是他的問題。他在抱怨說'這個'不能被關閉,迫使他'var me = this'。 – hugomg 2011-05-31 14:31:54

+0

我同意,但他想做什麼等於對抗語言。我 - 也許其他所有編寫JavaScript代碼的人 - 都希望在沒有本地變量賦值的情況下完成工作,但事實就是如此。 – 2011-05-31 15:17:11

5

var handler = (function(o) { o.progress();})(this)); 

不起作用,因爲它只是立即調用的匿名功能,因此立即調用o.progress()和分配匿名函數(不確定)到handler的返回值的原因。您需要從外部函數返回一個實際的功能:

handler = (function(me){ 
    return function(){ 
     return me.progress(); 
    } 
}(this)); 

在另一面,這相當於和一樣糟糕面色難看的變量賦值(但仍是有用的,尤其是如果這需要做一個循環,改變我而不是固定的)。


順便說一句,如果進度功能不必this裏面的任何電話,只是在做handler = this.progress(不含括號)就足夠。

0

你有沒有試過像這樣返回函數?

var handler = function(o){ 
    return function(){ 
     o.progress(); 
    } 
}(me); 

現在,您可以撥打:

handler(); 
5

匿名函數訪問me,因爲它是在外部功能(toggle功能)的內部聲明;它由通過外部函數關閉了

您的handler函數將被setInterval調用,該函數完全通過零參數。這意味着你不能在處理函數本身中使用參數。

我你真的想通過me明確,你可以寫一個函數接受一個參數,並讓該函數返回的沒有參數的匿名功能,但可以訪問創建者函數的參數:

toggle: function() { 
    var me = this; 
    var handler = (function (o) { return function() { o.progress() }; })(me); 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 

但是這基本上增加了一層重定向而沒有使其更清晰。除非你把這個創建功能拉到外面:

function createProgressHandler(o) { 
    return function() { 
     o.progress(); 
    }; 
} 

// ... 

toggle: function() { 
    var me = this; 
    var handler = createProgressHandler(me); 
    me.intervalId = setInterval(handler, me.intervalTime); 
    //...More code 
} 
相關問題