簡體   English   中英

作為返回匿名對象的參數的函數

[英]Function as a Parameter that Returns an Anonymous Object

我看到很多javascript代碼將函數作為返回匿名對象的參數傳遞。

myFunction(function() {
    return {
       foo: 'bar'
    };
});

使用它的優點或目的是什么,而不是簡單地直接傳遞匿名對象?

myFunction({
    foo: 'bar'
});

不同之處在於,如果更改第二個代碼段中傳遞的參數,則無法再次獲取原始參數。
如果你傳遞一個函數,你可以多次調用該函數並返回相同的參數。 (如果以這種方式實現該功能)

此外,如果您使用函數,您可以執行其他操作,例如記錄調用函數/參數的頻率等等。 因此,使用函數可為函數用戶增加更多靈活性。
另一方面,對於函數的開發人員來說,接受函數作為參數可能會導致每次調用函數時函數不必返回相同值的微小問題 - myFunc() == myFunc() COULD返回false,因此我不建議移交一個函數,如果它應該只是返回一個參數。

Backbone使用很多地方,如果傳遞得到值,他們將初始化函數,例如。

 Backbone.Model.extend({
     url: function() { return 'myurl.aspx'; }
 });
 // VS
 Backbone.Model.extend({
     url: 'myurl.aspx'
 });

如果您在知道網址之前必須進行一些計算/運行某些條件,這是很聰明的。

 Backbone.Model.extend({
     url: function() { 
         if ( this.get('name') ) {
             return 'service1.aspx';
         }
         else {
             return 'service2.aspx';
         }
     }
 });

您的第一個示例發送匿名函數作為myFunction的第一個參數,而第二個示例發送一個對象作為第一個參數。

myFunction(function() {
    return {
       foo: 'bar'
    };
}); // function() {...}

myFunction({
    foo: 'bar'
}); // {foo: 'bar'}

function myFunction(what) {
    console.log(what);
}

如果你在談論閉包,主要的區別是你可以在閉包中有私有變量:

var setGet = (function() {
    var v = null;
    return {
        get: function() { return v; },
        get: function(val) { v=val; }, 
    };
});
// VS:
var setGet = {
    v: null,
    get: function() { return this.v; },
    get: function(val) { this.v; }, 
};

在第一個例子中,你不能在setGet上使用.get / .set來訪問變量v ,而在2.例子中我可以通過設置setGet.v = 'new_val';來簡單地改變它setGet.v = 'new_val';

我認為,這真的取決於你看到使用的代碼。

在這種情況下, myFunction似乎要求您傳遞函數而不是Object。

但總的來說,考慮一下

myFunction(function() {

    var a = "bar";

    return {
       foo: a
    };
});

還有這個:

var a = "bar"

myFunction({
    foo: a
});

在第二種情況下,外部的任何人能夠訪問 但在第一種情況下,a變得類似於由函數公開為公共的私有變量。 因此,您可能會在人們希望在無類JS中遵循OOP概念的地方觀察到這一點。


另一種情況是需要回調函數或稍后要調用的函數。 因此,如果要保留數據直到某個事物結束,您可以將其作為函數的返回值使用,而不是全局存儲...

在第一個示例中,您正在傳遞回調函數。

When we pass a callback function as an argument to another function,
we are only passing the function definition. We are not executing the function
in the parameter.

And since the containing function has the callback function in its parameter as a function definition, it can execute the callback anytime. This allows us to execute the callback functions at any point in the containing function.

一個簡單的例子是jQuery點擊綁定:

/The anonymous function is not being executed there in the parameter. 
//The anonymous function is a callback function
$("#btn_1").click(function() {
    alert("Btn 1 Clicked");
});

但在第二個例子中,您只是將一個對象傳遞給被調用的函數。

使用此鏈接可獲取有關回調函數的更多詳細信息。 請享用 :)

暫無
暫無

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

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