Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

个人总结的前端开发规范 #8

Open
liusaint opened this issue Sep 21, 2017 · 0 comments
Open

个人总结的前端开发规范 #8

liusaint opened this issue Sep 21, 2017 · 0 comments

Comments

@liusaint
Copy link
Owner

JavaScript篇

  • 不主动及或误生产全局变量。类似var a = b = 1,会生成全局变量b。
  • 嵌套对象或计算而得的变量如果多次使用,则存一个副本。类似这样:
var innerA = document.getElementsByTagName('iframe')[0].contentWindow.a;
var inndrB = document.getElementsByTagName('iframe')[0].contentWindow.b;
  

修改成

var ifrContent = document.getElementsByTagName('iframe')[0].contentWindow
var innerA = ifrContent.a;
var inndrB = ifrContent.b;
  
  • 类似。jQuery对象,如多次使用需要保存到变量中使用,$()有额外的函数开销。
    jQuery对象命名建议以$开头方便区分。
$(this).trigger('click');
$(this).find('.b');
$('.a').trigger('click');
$('.a').find('.b');

修改成

var $this = $(this);
var $a = $('.a');
$this.trigger('click');
$this.find('.b');
$a.trigger('click');
$a.find('.b');
  • 减少dom访问和修改次数。比如循环渲染列表,不要拼一条插入一条。而是拼成一整个HTML字符串再统一插入页面节点中,批量修改dom。
  • 尽量不要用js直接修改css属性。而是用addClass\removeClass来代替。
  • 变量命名
    • 普通变量用小驼峰 applePen
    • 构造函数使用大驼峰 new Person()
    • 私有变量可以以_开头 _getName()
    • 尽量英文
    • 常量。大写字母,_分割。 MAX_TAB_LENGTH
  • 注释
    • 难以理解的地方。可能被认为错误的地方。
    • 对函数期望的参数、返回值、作者、日期注释。
  • 变量定义。尽量定义 在函数开头。一目了然。
function A(){
	var a='',b='',c='';
	---函数体---
}
  • for in循环。必须加Object.hasOwnProperty(prop)过滤属性。
  • 增加jQuery实例方法。 注意实例方法中的this指向jQ对象。区别于事件回调函数中的this。
$.fn.extend({
	alertValue:function(){
		alert(this.val());
	}
});
$("input.a").alertValue();//这样调用 this指向$("input.a")
  • 增加jQuery工具方法。
$.extend({
	alert1:function(){
		alert(1);
	}
});
$.alert1();//这样调用 
  • 事件绑定要有清晰的范围意识。比如不要随便进行 $('a').click(fn);这种太通用的标签来直接绑定事件。要将事件的范围限制在可控的范围内。比如同一个模块的函数可以绑定在同一个class名上。
  • 模块基本写法。
$(function() {
	function Person() {

	}
	Person.prototype = {
		constructor: Person,
		bindEvent: function() {
			var self = this;
			$('body').on('click', '.person-btn', function(event) {
				var $this = $(this),
					method = '';
				if ($this.hasClass('disabled')) {
					return;
				}
				method = $this.attr('method');
				typeof self[method] == 'function' && self[method]($this, event);

			});
		},
		sayHello: function($obj, event) {

		},
		sayGoodbye: function($obj, event) {

		}
	};
	(new Person()).bindEvent();
})
html:
<button class="person-btn" method="sayHello">你好</button>
<button class="person-btn" method="sayGoodbye">再见</button>
  • console.log控制台输出。生产环境尽量不要出现。或约定不使用原生console.log。自己封装log函数。
function log(){
	if('dev' == window.environment){
		console.log.apply(console,arguments);
	}	
}
log(1,2);//1,2
  • 减少if else的层级。
  • 函数体不要太长,不要超过一屏。
  • 要解绑事件可以考虑在事件绑定的时候就绑定一个命名空间。以免不小心将其他的事件一起解绑了。
  • 简单的工具方法可以写成jQuery实例方法或工具方法,复杂的功能组件可考虑以面向对象的方式写。
  • 减少try...catch的使用。有错误就让它暴露出来。及时解决。
  • 如果函数参数多。可改用option对象的方式来传参。并设置默认值。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant