首页 > 解决方案 > 在调用内容时未修改 Javascript 中传递给构造函数的数组

问题描述

我在调用上下文中导入了以下模块:

function Controls(elem, viewMatrix) {

    var xD, yD;

    this.ppdX = 10;
    this.ppdY = 10;

    this.state = 0;
    var dx = 0;
    var dy = 0;

    function getXY(evt) {
        var x = evt.pageX - elem.offsetLeft;
        var y = evt.pageY - elem.offsetTop;
        return [x, y];
    }

    function onDown(evt) {
        this.state = 1;
        [xD, yD] = getXY(evt);
    }

    function onUp(evt) {
        this.state = 0;
        [dx, dy] = [0, 0];
    }

    function onMove(evt) {
        if (!this.state) return;
        var [x, y] = getXY(evt);
        [dx, dy] = [x - xD, y - yD];
    }

    this.updateView = function () {
        viewMatrix = Mtx.mult(viewMatrix, Mtx.rotY(-Mtx.DtoR * dx / this.ppdX));
        viewMatrix = Mtx.mult(viewMatrix, Mtx.rotX(-Mtx.DtoR * dy / this.ppdY));
    }

    elem.addEventListener("mousedown", onDown.bind(this));
    elem.addEventListener("mouseup", onUp.bind(this));
    elem.addEventListener("mousemove", onMove.bind(this));
}

export default Controls;

调用上下文如下:

import Controls from './js/controls.module.js';
...

viewMatrix = Mtx.makeIdent(4, 4);
controls = new Controls(renderer.domElement, viewMatrix);
...

function animate() {

    requestAnimationFrame(animate);

    if (controls.state) {
        controls.updateView();
        ...
        console.log(viewMatrix);
    }

...

}

其中 viewMatrix 是一个 4x4 数组,定义如下:

viewMatrix = [[...],[...],[...],[...]];

我可以看到,虽然 viewMatrix 在 updateView() 调用中发生了变化,但它在调用上下文中没有变化。数组应该通过引用传递,在这种情况下不是这样吗?

我知道我可以将矩阵从 updateView() 返回到调用上下文并在那里覆盖 viewMatrix,但我想知道它为什么不更新,也许还有另一种方法可以编写此代码以便它自行更新?

编辑乘法代码:

    mult(A, B) {
        var C = [];
        var Ar = A.length, Ac = A[0].length;
        var Br = B.length, Bc = B[0].length;
        if (Ac != Br) {
            console.log("mult(): dimentions mismatch");
            return C;
        }
        for (let ar = 0; ar < Ar; ar++) {
            C[ar] = [];
            for (let bc = 0; bc < Bc; bc++) {
                C[ar][bc] = 0;
                for (let ac = 0; ac < Ac; ac++) {
                    C[ar][bc] += A[ar][ac] * B[ac][bc]
                }
            }
        }
        return C;
    },

标签: javascript

解决方案


推荐阅读