【发布时间】: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);
}
}
我不应该污染全局命名空间,所以我应该将所有函数放在一个大函数中。好的,所以这是有道理的。毕竟,我只调用一次。
但这意味着我的所有函数和包含我使用的所有变量的生命对象共享相同的范围 - 进一步嵌套会影响性能,因为所有这些函数都被重复调用,所以我可以直接使用生命对象。 .
...但是如果发生命名冲突,我无法更改它。
问题:
- 查看 eventlistner - 传递事件并将数据直接写入生命对象或返回值更好吗?
我自发地说,我需要在每次使用时创建和销毁的函数方面产生额外的开销(可能很多),并使代码更难阅读,但也许我'我错了。
- 我是否应该停止将值和对象传递给函数,而直接使用生命对象来处理我所有函数中的操作数据?
我主要担心的是,随着项目的增长,生命对象也会增长……但这会显着降低性能,还是 javascript 在处理对象方面足够好?还有什么我错过的吗?
- 查看循环函数 - 仅传递生命对象的屏幕部分会加速屏幕对象值的处理吗?
感谢您的意见。
【问题讨论】:
-
1) 2) 3) 没关系。
标签: javascript function oop scope nested