2015-08-11 5 views
4

Чтение некоторые унаследованного кода, и нашелКакова цель возврата функции из функции?

A.prototype.setSize: function() { 
    var v1 = new Vector2(); 
    return function (size) { 

    var halfSize = v1.copy(size).multiplyScalar(0.5); 
    this.min.sub(halfSize); 
    return this; 

    }; 

}(), 

Я интересно:

  1. почему определяют SetSize как функцию, возвращать другую функцию
  2. Также определенная функция выполняется сразу.

любой свет, чтобы пролить на это?

Обновлено:

я могу просто использовать

A.prototype.setSize: function (size) { 
     var v1 = new Vector2(); 

     var halfSize = v1.copy(size).multiplyScalar(0.5); 
     this.min.sub(halfSize); 
     return this; 

    }, 

Является первым сниппет лучше, чем второй?

+0

Если вам необходимо оптимизировать 'setSize' то первая версия закрытия, вероятно, лучше. Я считаю, что это менее читаемо, поэтому, если производительность не нужна, я бы просто использовал вашу вторую более плоскую версию. –

ответ

5
  1. Так возвращаемая функция может получить доступ к значению v1 каждый раз, когда он вызывается без v1 глобальной (или иным образом, не частный)
  2. Это так возвращаемая функция присваивается setSize
+1

Мне не нужно устанавливать v1 как глобальный, я могу просто использовать var v1? –

+0

@AdamLee - Вы должны положить оператор 'var' где-то *. Нет другого места, кроме того, чтобы закрыть это: (a) не сделает его доступным для другого кода или (b) будет воссоздавать его каждый раз, когда вызывается 'setSize'. – Quentin

2

Цель в этом конкретном случае - не создавать новый объект Vector каждый раз, когда вызывается setSize. Это стратегия кэширования. Альтернатива была бы просто иметь плоскую функцию:

A.prototype.setSize: function (size) { 
    var v1 = new Vector2(); 
    var halfSize = v1.copy(size).multiplyScalar(0.5); 
    this.min.sub(halfSize); 
    return this; 
} 

я бы только использовать закрывающие кэшированные версии setSize, если я обнаружил, что я имел проблемы с производительностью из-за new Vector2().

2

Классическим примером является:

function createAdder(x) { 
    return function add(y) { 
    return x + y; 
    } 
} 

var addTwo = createAdder(2); 
// addTwo is a function that takes one input and adds 2 to it 
addTwo(3); // 5 
addTwo(9); // 11 

Идея заключается в том, что вы хотите создать функцию, но функция, которую вы хотите создать, зависит от чего-то. В этом случае мы хотели создать функцию addX.

См. Chapter 5 of Eloquent Javascript для получения дополнительной информации. В частности, раздел Higher Order Functions.


Это также может быть более СУХОЙ. Рассмотрим:

function createSecretAdder() { 
    var secretNumber = generateSecretNumber(); // THIS TAKES A LONG TIME 
    return function(n) { 
    return secretNumber + n; 
    } 
} 
var secretAdder = createSecretAdder(); // slow 
secretAdder(2); // fast 
secretAdder(7); // fast 

против

function createSecretAdder() { 
    return function(n) { 
    var secret = getSecretNumber(); // THIS TAKES A LONG TIME 
    return secretNumber + n; 
    } 
} 
var secretAdder = createSecretAdder(); // fast 
secretAdder(2); // slow 
secretAdder(7); // slow 

Первое сушилку и быстрее, чем второй. Это должно касаться вашего comment и обновления к вашему вопросу.

Примечание: вам нужно понять, closures, чтобы понять, как это работает.


Что касается того, почему это немедленно вызывается, см. here.

2

Это функция закрытия. Используется для скрытия переменных из глобальной области. Читайте дальше и посмотреть некоторые примеры здесь

JS function closures

Смежные вопросы