2016-10-18 2 views
2

, Что преимущество определения функции, как это: obj = { func: function(){return function func(){return this.something;};}() }Anvantage из себя функции ссылающееся внутри определения функции

Story: Я искал способ, как повернуть three.js Vector3 на определенный угол вокруг оси и нашел это: How to rotate a Three.js Vector3 around an axis? Мне было интересно, как функция работает и ее просматривала: https://github.com/mrdoob/three.js/blob/master/src/math/Vector3.js. Функция выглядит так:

applyAxisAngle: function() { 

    var quaternion; 

    return function applyAxisAngle(axis, angle) { 

     if (quaternion === undefined) quaternion = new Quaternion(); 

     return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 

    }; 

}(), 

В чем причина этого способа определения функции?

+0

Учитывая, что позиция 'd' и' n', 'anvantage' - это некоторая опечатка – Rajesh

+3

преимуществом является скрыть' quaternion'. 'applyAxisAngle' может использовать его, но никто другой. – Maxx

ответ

2

Функциональное выражение с немедленным вызовом (IIFE) позволяет автору этого кода предоставить функцию applyAxisAngle поистине приватную переменную quaternion, которую нигде в любом месте не видно.

Этот код в основном делает это:

var quaternion; 

// ... 

applyAxisAngle: function applyAxisAngle(axis, angle) { 

    if (quaternion === undefined) quaternion = new Quaternion(); 

    return this.applyQuaternion(quaternion.setFromAxisAngle(axis, angle)); 
}, 

... но сохраняющий quaternion полностью частной, а не разделяя его с кодом в объеме, где появляется все это.

Он отклоняет конструкцию объекта Quaternion до момента его первого вызова, а затем повторно использует этот объект во всех последующих вызовах, используя значение из этой частной переменной quaternion.

2

На самом деле, причина была написана таким образом, чтобы не было quaternion частным, хотя это фактически является побочным эффектом реализации.

Это было написано таким образом, чтобы избежать создания экземпляра new Quaternion() каждый раз, когда вызывается метод, и, следовательно, избегая сбора мусора.

applyAxisAngle() часто называют жесткими петлями - много раз в секунду. Написав метод таким образом, объект Quaternion создается только один раз.

Реализованная конструкция называется «закрытием».

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