2017-04-14 19 views
0

我試圖將我的threejs項目分解成更小的模塊,並且我遇到了困難時期。以此功能爲例:將threejs的IIFE函數轉換爲es6?

var updateCamera = (function() { 
    var euler = new THREE.Euler(0, 0, 0, 'YXZ'); 

    return function() { 
     euler.x = motion.rotation.x; 
     euler.y = motion.rotation.y; 
     camera.quaternion.setFromEuler(euler); 

     camera.position.copy(motion.position); 
     camera.position.y += 10.0; 
    }; 
})(); 

假設我想將此updateCamera函數分解爲它自己的文件並導入它。由於自我執行,我有點困惑。任何人都可以幫我一把嗎?

+0

我將引用這個問題找到答案:http://stackoverflow.com/問題/ 32746615 /命名空間與 - iife功能於ES6。 ES6 IIFE可以用幾種方式編寫,但我更喜歡用塊範圍包裝{...}替換它。 – autoboxer

+1

你在哪裏得到變量'camera'和'motion'? –

回答

2

而是分配給(全球?)updateCamera變量,使用(默認)導出。您可以放棄整個IIFE,因爲每個模塊都有自己的範圍;因此即使在模塊頂層,euler也將無法訪問和靜態化。

您也可能希望顯式聲明對Three.js的依賴性,而不是依賴於全局性。

// updateCamera.js 
import { Euler } from 'three'; 

var euler = new THREE.Euler(0, 0, 0, 'YXZ'); 

export default function updateCamera(camera, motion) { 
    euler.x = motion.rotation.x; 
    euler.y = motion.rotation.y; 
    camera.quaternion.setFromEuler(euler); 

    camera.position.copy(motion.position); 
    camera.position.y += 10.0; 
} 

然後,你可以通過做

// main.js 
import updateCamera from './updateCamera'; 

… 
updateCamer(camera, motion); 

注意cameramotion應該作爲參數在這裏被傳遞使用它在其他模塊。再次,不要依賴全局變量;如果你不想通過他們周圍無處不在,你還可以創建它們導出和模塊,您可以做

import {camera, motion} from './globals'; 
+0

謝謝!對此,我真的非常感激 – user3591425

1

可以說我想把這個updateCamera函數放到它自己的文件中並導入它。由於自我執行,我有點困惑。任何人都可以幫我一把嗎?

那麼在這種情況下,IIFE的唯一要點是使euler「私人」。因爲每個文件,您可以在節點自身的背景下,你可以做到這一點,而不IIFE容易

// Camera.js 

import { Euler } from 'three' 

const euler = new Euler(0, 0, 0, 'YXZ') 

export const updateCamera = (camera, motion) => { 
    euler.x = motion.rotation.x 
    euler.y = motion.rotation.y 
    camera.quaternion.setFromEuler(euler) 
    camera.position.copy(motion.position) 
    camera.position.y += 10.0 
} 

使用它是這樣的

import { updateCamera } from './Camera' 

// const camera = ..., motion = ... 

updateCamera(camera, motion)