将threejs的IIFE函数转换为es6?

时间:2017-04-14 02:56:25

标签: javascript three.js ecmascript-6

我正试图将我的threejs项目分解成更小的模块,而且我很难过。以此功能为例:

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函数分解为自己的文件并导入它。我对它如何自我执行有点困惑。任何人都可以帮我一把吗?

2 个答案:

答案 0 :(得分:1)

不是分配给(global?)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';

答案 1 :(得分:0)

  

让我们说我想将这个updateCamera函数分解为自己的文件并导入它。我对它如何自我执行有点困惑。任何人都可以帮我一把吗?

在这种情况下,IIFE的唯一要点是让import { updateCamera } from './Camera' // const camera = ..., motion = ... updateCamera(camera, motion) 为“私人”。因为每个文件都在Node中为您提供了自己的上下文,所以您可以轻松地在没有IIFE的情况下执行此操作

setOutputFormat(QPrinter::PdfFormat)

使用它就像这样

parameters:
    app_version: 1.0.0

framework:
    assets:
        version:   '%app_version%'
        version_format: '%%1$s?%%2$s'
        base_urls: ['%your_assets_urls%']