簡體   English   中英

javascript匿名函數參數傳遞

[英]javascript anonymous function parameter passing

我有一些javascript代碼(在一個對象中):

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

我是javascript的新手,所以盡我所知,實際上將me變量傳遞me匿名函數。 我想知道是否有一種更具說明性的方式呢? 我想要的東西是:

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

但這似乎不起作用......我錯過了什么嗎? 這是“這是語言的工作方式,只需聲明一個局部變量並處理它”的情況嗎?

更新:

我的問題的根源是/我對javascript范圍和閉包的理解不清楚。 我發現這篇文章可以幫助我理解更多。

你可以使用“.bind()”:

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

新的瀏覽器具有“bind()”,並且Mozilla文檔具有可用於修補舊瀏覽器的可靠實現。

原因

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

不起作用,因為它只是立即調用anon函數,因此立即調用o.progress()並將anon函數(undefined)的返回值賦給handler 您需要從外部函數返回實際函數:

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

另一方面,這是等效的,同樣看起來像看起來糟糕的變量一樣糟糕(但仍然有用,特別是如果需要在循環中完成,改變i而不是修復它)。


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

匿名函數可以訪問me因為它是在外部函數內部聲明的( toggle函數); 它由外部功能關閉

你的handler函數將由setInterval調用,它正好傳遞零參數。 這意味着您不能在處理函數本身中使用參數。

真的想明確地傳遞me ,你可以編寫一個接受參數的函數,並讓該函數返回一個沒有參數的匿名函數,但是它可以訪問creator函數的參數:

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
}

你有什么關閉。 創建並分配給handler保留對me對象的引用。 這是正常的,日常的JavaScript,這就是閉包一般工作的方式。

你試過這樣的函數嗎?

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

現在你可以打電話:

handler();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM