【问题标题】:Efficiency of passing values and objects to nested functions in javascript在javascript中将值和对象传递给嵌套函数的效率
【发布时间】:2018-04-05 05:39:40
【问题描述】:

我正在尝试在 javasript 中从过程式编程转向面向对象的编程,因为我需要让我的代码更易于理解。

我怀疑我需要牺牲一些代码效率来提高可读性,但我仍然希望它成为我编程风格的主要焦点。不过,如果新的编程范式效率较低,我真的不关心它们。

代码:

function app(){
    var cnv = document.getElementById('cnv1');
    var ctx = cnv.getContext('2d');

    var life = setup('app');    //builds an object

    cnv.addEventListener('mousemove', MyMouseOver, false);

    //requestAnimationFrame polyfill

    loop();

    function loop() {
        requestAnimationFrame(loop);
        if (life.screen.name == 'loading'){
            runLoading(life.screen);
        } else if (life.screen.name == 'mainMenu'){
            runMainMenu();
        }
    }

    function runLoading(screen){
        //does stuff with the screen object
    }

    function MyMouseOver(MyMouse) {
        if (MyMouse.pageX != undefined && MyMouse.pageY != undefined) {
            var x = MyMouse.pageX;
            var y = MyMouse.pageY;
        }
        else {
            x = MyMouse.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
            y = MyMouse.clientY + document.body.scrollTop + document.documentElement.scrollTop;
        }
        x -= cnv.offsetLeft;
        y -= cnv.offsetTop;
        life.mouseX = x;
        life.mouseY = y;
        console.log(life.mouseX + ' - ' + life.mouseY);
    }
}

我不应该污染全局命名空间,所以我应该将所有函数放在一个大函数中。好的,所以这是有道理的。毕竟,我只调用一次。

但这意味着我的所有函数和包含我使用的所有变量的生命对象共享相同的范围 - 进一步嵌套会影响性能,因为所有这些函数都被重复调用,所以我可以直接使用生命对象。 .

...但是如果发生命名冲突,我无法更改它。

问题:

  1. 查看 eventlistner - 传递事件并将数据直接写入生命对象或返回值更好吗?

我自发地说,我需要在每次使用时创建和销毁的函数方面产生额外的开销(可能很多),并使代码更难阅读,但也许我'我错了。

  1. 我是否应该停止将值和对象传递给函数,而直接使用生命对象来处理我所有函数中的操作数据?

我主要担心的是,随着项目的增长,生命对象也会增长……但这会显着降低性能,还是 javascript 在处理对象方面足够好?还有什么我错过的吗?

  1. 查看循环函数 - 仅传递生命对象的屏幕部分会加速屏幕对象值的处理吗?

感谢您的意见。

【问题讨论】:

  • 1) 2) 3) 没关系。

标签: javascript function oop scope nested


【解决方案1】:
  1. 它是一个事件监听器,因此您不能将值直接返回到您的主线程。在紧密循环中,函数创建开销可能很大,但似乎您不是每次都创建事件侦听器。

  2. 大多数时候处理对象已经足够了。不要过早优化,了解 gc 是如何工作的。根据您认为的发展方式设计您的代码。

  3. 是的,如果编译器没有自动优化这部分,它会。但大多数现代编译器应该能够做到。

【讨论】:

    猜你喜欢
    • 2011-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 2019-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多