变量作用域:

  1. 尽量减少全局对象(命名冲突,不利于模块化);
  2. 始终声明局部变量(JS lint工具);
  3. 避免使用with语句(使用简短的变量名代替重复访问的对象;显示地绑定局部变量到对象属性上,不使用with隐式绑定它)
  4. 闭包:
    1. 许使用在当前函数以外定义的变量;
    2. 即使外部函数已返回,当前函数仍然可以引用在外部函数所定义的变量;(闭包比创建它们的函数有更长的生命周期)
    3. 闭包可以更新外部变量的值;(闭包在内部存储其外部变量的引用,并能读写这些变量)
  5. 变量声明提升:
    1. 代码块中的变量声明会被隐式地提升到封闭函数的顶部;
    2. 重声明变量被视为单个变量;
    3. 考虑手动提升局部变量声明,以避免混淆;
    
  6. 使用立即调用的函数表达式创建局部作用域;闭包存储的是外部变量的引用,而非值;只在进入一个作用域时,会为作用域中的变量在内存中分配一个’槽’(slot);
  7. 当心命名函数表达式的作用域:
    1. 命名函数和匿名函数表达式的区别:前者会绑定与其函数名相同的变量上,该变量将作为该函数内的一个局部变量。(可以用来写递归表达式)但是,这个变量的作用域只在其自身函数中。(不像函数声明,命名函数表达式不能通过其内部的函数名在外部被引用)。
    2. 命名函数表达式的真正用法是用来调试,用在栈跟踪中;(在开发阶段使用命名函数表达式做调试,发布前通过预处理将所有的函数表达式转为匿名)
    
  8. 避免eval创建局部变量:
    1. 执行到eval()时,才对eval(“var y=x;")中的变量进行声明;
    2. 如果eval函数代码可能创建全局变量,将此调用封装到嵌套的函数中以防止作用域污染;
    
  9. 间接调用eval优于直接调用eval。将eval()函数名存放在一变量x中,通过x()变量名调用能够函数失去对所有局部作用域的访问能力;

使用函数:

  1. 方法调用、函数调用、构造函数调用之间的区别;
  2. 使用call()自定义接受者来调用函数;可以用来调用在给定的对象中不存在的方法;可以定义告捷函数允许使用者给回调函数指定接收者;

    forEach(fun1,obj1){fun1.call(obj1,argument1,argument2,…);}

  3. 使用apply()指定一个可计算的参数数组来调用可变参数数的函数;

    使用apply()的第一个参数给可变参数的方法提供一个接收者,不需要时可设为null;

  4. 使用隐式的arguments对象创建可变参数的函数;

    对可变参数的函数提供一个额外的固定元数的版本,从而使使用者无需借助apply();

  5. 不要修改arguments对象(所有命名参数都是arguments对象中对应索引的别名);

    使用[].slice.call(arguments)将arguments对象复制到一个真正的数组中再进行修改;

  6. 使用argument时当心函数嵌套层级;(每个函数体有自己的arguments变量);

    绑定一个明确作用域的引用到arguments变量,从而可以在嵌套的函数中引用它;

  7. 提取一个方法不会讲方法的接收者绑定到该方法的对象上;(有的高阶函数可以指定一个作为调用方法接收者的参数);

    当给高阶函数传递对象方法时,使用匿名函数在适当的接收者上调用该方法;

    使用bind()创建绑定到适当接收者的函数;

  8. 函数柯里化(使用bind()实现,即创建一个固定需求参数子集的委托函数);

    传入null或undefined作为接收者的参数来实现函数柯里化,从而忽略其接收者;

  9. eval()会将出现在字符串中的所有变量引用作为全局变量来解释;

    所以,当将字符串传递给eval()执行它们的API时,不要在字符串中包含局部变量,因为eval(字符串)中定义的全局变量与那些通明的局部变量混淆;

    优化:接受函数调用的API更优于eval()执行字符串的API;

  10. 通常避免使用呢函数对象的toString();
    不同的引擎执行结果不同;执行结果不会暴露存储在必报中的局部变量值
  11. 避免使用非标准的arguments.callee和arguments.caller属性;

对象和原型:

  1. C.prototype属性是new C()创建的对象的原型;

    Object.getPrototypeOf(obj)是ES5中检索对象原型的标准函数;

    Obj.proto是检索对象原型的非标准方法;

    类是由一个构造函数和一个关联的原型组成的一种设计模式;

  2. 始终不要修改对象的proto属性:(并不是多有平台支持改变对象原型的特性,造成可移植性的问题;性能问题)

    使用Object.create()给新对象设置自定义的原型;

  3. 将方法存储在实例对象中将创建该函数的多个副本,因为每个实例对象都有一份副本;
  4. 使用闭包存储私有数据:

    1. for…in,ES5的Object.keys()和Object.getOwnPropertyNames()能获取对象的所有属性名;
    2. 使用命名规范给私有属性名前置/后置下划线_;用户不应该检查或修改该属性,以便对象仍能自由地改变其实现;
    3. 对象和闭包具有相反的策略:对象的属性会被自动地暴露出去,然而闭包中的变量会被自动地隐藏起来;

  5. 一般情况下,任何不可变的数据可以被存储在原型中而被安全地共享;将可辨的实例状态(有状态的数据)存储在实例对象中;(在原型对象中最常见的数据是方法,而每个实例的状态都存储在实例对象中;)
  6. this变量隐式绑定的问题:this变量的作用与总是由其最近的封闭函数所决定。
  7. 避免继承标准类:

    1. 继承标准类往往会由于一些特殊的内部属性(如[class])而被破坏;
    2. 使用属性委托由于继承标准类;
  8. 对象是接口,原型是实现;

    避免检查你无法控制的对象的原型结构;

    避免检查实现在你无法控制的对象内部的属性;

  9. 避免轻率地使用猴子补丁(修改对象的原型的属性)

数组和字典:

  1. 使用对象字面量构建轻量级字典;
  2. 使用null原型以防止原型污染;

    1. 设置一个构造函数的原型属性为null/undefined,但实例化该构造函数后的得到的是Object的实例;
    2. ES5中的Object.create(null)能够使用一个用户指定的原型链和一个属性描述符动态地构造对象;
    3. 比较老的环境中,{proto:null}对象字面量的语法也支持初始化一个原型链为null的新对象;但是proto极不标准,也不完全可移植;不要用proto作为字典中的key,因为一些环境将其作为特殊的属性对待;
  3. 使用hasOwnProperty()避免原型污染;

    使用词法作用域和call()避免覆盖hasOwnProperty();

  4. 使用数组而非字典来存储有序集合;

    使用for…in…枚举对象属性应当与顺序无关;(将字符串连接,而非加运算)

  5. 不在Object.prototype中增加可枚举属性;如果必须要增加属性,考虑用ES5中Object.defineProperty()将其定义为不可枚举属性;
  6. 避免在枚举期间修改对象;

    如果迭代一个对象的时候,可能会修改对象,使用while()/for()代替for…in;

    为了在不断变化的数据结构中能够预测枚举,考虑使用一个有序的数据结构,如数组,而不是使用字典对象;

  7. 数组迭代优先使用for()而不是for…in;

    考虑在循环之前讲数组的长度存储在一个局部变量中以避免重新计算数组长度;

  8. 使用迭代方法(Array.prototype.forEach/Array.prototype.map)优于循环;

    在需要终止循环的情况下,仍然推荐使用传统的循环。另,some/every()也可用于提前退出;

  9. 对于类数组对象,通过提取方法对象并使用其call()来复用通用的Array方法;

    任意一个具有索引属性和恰当length属性的对象都可以使用通用的Array方法;

  10. 数组字面量和数组构造函数创建数组时是有区别的;

    使用数组字面量定义数组优于使用数组构造函数;

读书计划

1、《js权威指南》

2、《js语言精粹》

3、《js性能优化》

1
梳理知识点并记录学得的新知识整理成博客;

社区浏览

  1. CNode技术社区
  2. Github

常用socket函数

1、socket函数:为了执行网络输入输出,一个进程必须做的第一件事就是调用socket函数获得一个文件描述符。

1
2
3
#include <sys/socket.h>
int socket(int family,int type,int protocol);    
返回:非负描述字---成功   -1---失败

2、connect函数:当用socket建立了套接口后,可以调用connect为这个套接字指明远程端的地址;如果是字节流套接口,connect就使用三次握手建立一个连接;如果是数据报套接口,connect仅指明远程端地址,而不向它发送任何数据。

1
2
3
4
#include <sys/socket.h>       
int connect(int sockfd,const struct sockaddr * servaddr,socklen_t
addrlen)
;  

返回:0---成功   -1---失败

3、bind函数:为套接口分配一个本地IP和协议端口,对于网际协议,协议地址是32位IPv4地址或128位IPv6地址与16位的TCP或UDP端口号的组合;如指定端口为0,调用bind时内核将选择一个临时端口,如果指定一个通配IP地址,则要等到建立连接后内核才选择一个本地IP地址。

1
2
3
4
#include <sys/socket.h>   
int bind(int sockfd,const struct sockaddr * myaddr,socklen_t
addrlen)
;

返回:0---成功   -1---失败

4、listen函数:listen函数仅被TCP服务器调用,它的作用是将用sock创建的主动套接口转换成被动套接口,并等待来自客户端的连接请求。

1
2
3
#include <sys/socket.h> 
int listen(int sockfd,int backlog);   
返回:0---成功   -1---失败

5、accept函数:accept函数由TCP服务器调用,从已完成连接队列头返回一个已完成连接,如果完成连接队列为空,则进程进入睡眠状态。

1
2
3
4
#include <sys/socket.h>          
int accept(int sockfd,struct sockaddr *
cliaddr,socklen_t * addrlen)
;  

回:非负描述字---成功   -1---失败

6、inet_pton函数:将点分十进制串转换成网络字节序二进制值,此函数对IPv4地址和IPv6地址都能处理。

1
2
3
#include <arpa/inet.h>
int inet_pton(int family,const char * strptr,void * addrptr);
返回:1---成功 0---输入不是有效的表达格式 -1---失败

7、inet_ntop函数:和inet_pton函数正好相反,inet_ntop函数是将网络字节序二进制值转换成点分十进制串。

1
2
3
4
#include <arpa/inet.h>   
const char * inet_ntop(int family,const void *
addrptr,char * strptr,size_t len)
;  

返回:指向结果的指针---成功   NULL---失败

8、fock函数:在网络服务器中,一个服务端口可以允许一定数量的客户端同时连接,这时单进程是不可能实现的,而fock就分配一个子进程和客户端会话,当然,这只是fock的一个典型应用。

1
2
3
#include <unistd.h>   
pid_t fock(void);
返回:在子进程中为0,在父进程中为子进程ID   -1---失败
与markdown相关的工具:

  1. Droplr
  2. Cloudapp
  3. ezShare for Mac
  4. 围脖图床修复计划

一、分类


创建类:

  1. Factory Method(工厂方法)
  2. Abstract Factory(抽象工厂)
  3. Builder(建造者)
  4. Prototype(原型)
  5. Singleton(单例)

结构型:

  1. Adapter Class/Object(适配器)
  2. Bridge(桥接)
  3. Composite(组合)
  4. Decorator(装饰)
  5. Facade(外观)
  6. Flyweight(享元)
  7. Proxy(代理)

行为型:

  1. Interpreter(解释器)
  2. Template Method(模板方法)
  3. Chain of Responsibility(责任链)
  4. Command(命令)
  5. Iterator(迭代器)
  6. Mediator(中介者)
  7. Memento(备忘录)
  8. Observer(观察者)
  9. State(状态)
  10. Strategy(策略)
  11. Visitor(访问者)

二、设计模式的六大原则


  1. 开闭原则(Open Close Principle)

    开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。

  2. 里氏代换原则(Liskov Substitution Principle)

    里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。
    里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

  3. 依赖倒转原则(Dependence Inversion Principle)

    这个是开闭原则的基础,具体内容:针对接口编程,依赖于抽象而不依赖于具体。

  4. 接口隔离原则(Interface Segregation Principle)

    这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。降低依赖,降低耦合。

  5. 迪米特法则(最少知道原则)(Demeter Principle)

    一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

  6. 合成复用原则(Composite Reuse Principle)

    原则是尽量使用合成/聚合的方式,而不是使用继承。

三、23种设计模式:


  1. 工厂方法模式(Factory Method)
  2. 抽象工厂模式(Abstract Factory)
  3. 例模式(Singleton)
  4. 建造者模式(Builder)
  5. 原型模式(Prototype)
    。。。未完待续

#html代码语义化;

标签语义化的好处

让你使用标签语义化的理由可以有无数条:
  1. 去掉样式或者样式丢失时页面结构依然清晰分明
  2. 移动设备能够更加完美的展示你的网页(移动设备对css的支持较弱)
  3. 阅读器会根据标签的语义自动解析,呈现更容易阅读的内容形式(无障碍阅读)
  4. 搜索引擎会根据标签的语义确定上下文和权重问题
  5. 便于后期的开发以及维护,团队合作效率提高

写HTML代码时应注意什么?
  1. 尽可能少的使用无语义的标签div和span;
  2. 在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利;
  3. 不要使用纯样式标签,如:b、font、u等,改用css设置。
  4. 需要强调的文本,可以包含在strong或者em标签中(浏览器预设样式,能用CSS指定就不用他们),strong默认样式是加粗(不要用b),em是斜体(不用i);(b标签会被搜索引擎忽略)
  5. 使用表格时,标题要用caption,表头用thead,主体部分用tbody包围,尾部用tfoot包围。表头和一般单元格要区分开,表头用th,单元格用td;
  6. 表单域要用fieldset标签包起来,并用legend标签说明表单的用途;
  7. 每个input标签对应的说明文本都需要使用label标签,并且通过为input设置id属性,在lable标签中设置for=someld来让说明文本和相对应的input关联起来。

xHTML 1.0规范是什么?
  1. 白帽SEO:

    SEO技术之经典30个白帽技术,对于网络推广的人来说,如何让搜索引擎搜索到你的网站及让你的网站能在主流的搜索引擎上有良好的排名一直是对于SEO技术员来说一个非常头痛的事情,网络推广的技术手段也有非常多手法,如黑帽SEO技术,白帽SEO技术等。。。但是各种技术的用法和手段已经对搜索引擎的友好度都不一样的,今天呢我为大家介绍下如何能让搜索引起对你的网站有好感已经很稳定的,SEO技术之经典30个白帽技术手段。

    • 网站更新有规律,每天更新或有规律几天一更新
    • 内容评论中出现最好出现关键词
    • 内容靠前部和最后部分出现关键词
    • 按照web2.0标准建站,最好通过W3C验证
    • 找内容相关页面的导入链接
    • 导入链接锚文本中包含关键词
    • 网站生成伪静态页面,当然直接为静态页面更好。静态化页面更容易被搜索引擎收录
    • 注重网站内容的原创性
    • 各页面的相似性不要超过70%
    • 页面整理有序,文字分段合理
    • 锚文字在于网页内容中
    • 在H1,H2标签中加入关键词
    • 网页内容围绕页面主要关键词展开,不要退离与整站主题
    • 链出链接锚文字中包含关键词
    • 图片名包含关键词
    • 外部导入链接要有规律的,忌短时间突然加很多或减少很多
    • ALT属性中加入关键词
    • URL中体现英文关键词
    • 网页title中出现关键词
    • 页面标签中出现关键词(1-4个)
    • 描述标签中出现关键词
    • 内容中自然分布关键词
    • 页面关键词密度6-8%
    • 锚文字要多样化(SEO,SEO培训网,SEO技巧)
    • 把关键词用粗体或斜体表现
    • 外部导入链接所在的页面导出链接不要超过100个
    • 导入链接最好来自不同IP地址
    • 找高PR值站导入链接
    • 锚文本周围出现相关关键词
    • 网站的外部链接页面内容与关键词的相关性尽量高

  1. 归类总结策略

    如今互联网上的资源浩如烟海,你可以按照某种分类或者归类,然后直接列出一个清单,表明相关数据等等,这样的文章很容易组织,也容易被作为权威数据而被大量引用。
    例如:“中国10大公认知名导航网”,你可以建立一个知名导航网列表,然后列出导航网列表顺序;“豆腐制作方法大全”,详细的列出常用的制作豆腐的方法;“生活中应该注意的×××的10细节”。 从表面上看,你只做出来的列表很简单,但是却是非常实用的,这样就会成为权威文件而被大量引用,引用者就会链接向这样的文章,以此作为自己文章的佐证。

  2. 增加文章内容的权威性
    要想把自己的数据作为权威的数据来参考,你就必须把自己的数据弄得更加权威,内容通俗易懂,深入浅出,便于人们理解和掌握,这样有利于更多的人为你传播。
    尽量减少语法或拼写错误,结构合理,措辞严谨,因为权威的数据中出现不应有的错误,使权威性大打折扣。
    为站点添加“隐私政策”、“关于我们”、“联系方式”、“律师顾问”等等会是网站变得更加可信,因为在人们的心中,公司的信誉要高于个人。

  3. 巧妙利用新闻站点和RSS聚合
    撰写高质量的文章,然后在对应的行业新闻网站发布。这些权重高的网站排名高、人气旺,浏览量非常大,能在这里发表文章除了能增加网站的反向链接,还会给你带来意想不到的流量。
    例如:你要是研究SEO方面的文章,就要向SEO方面的网站和论坛上发表 发表动态性的文章你可以提交新闻门户网站,然后提供稿件的来源。
    为了推广的需要,可以同其他站点交换文章,相互发表,增加文章的出现率和点击率。
    利用互联网上的RSS聚合,把文章发送的RSS网站上,便于人们阅读和收藏。

  4. 利用网址站、目录站和社会化书签
    根据自己网站的情况,把自己的网站提交到网站开放目录或者其他免费目录中,在中国的目录站主要有HAO123、百度网址大全、谷歌网址大全等等。这些目录站的人气非常旺,如果能被这些网站收录,不仅仅带来的是流量,更重要的为你的网站带去源源不断的网络蜘蛛,这对网站被搜索引擎收录、网站关键词的排名都是非常有效的。
    把自己的精品文章添加到百度搜藏、雅虎搜藏、Google书签、QQ书签等社会化书签。
    让用户通过Google阅读器、RSS等订阅你的文章,不断扩大网站的影响力及其知名度。

  5. 合作伙伴、链接交换充分利用合作伙伴或者商业伙伴之间的关系,尽可能的让对方为自己的网站添加一个链接或者互换一个链接(当然要互换权重高的)。
    管理好自己的友情链接,想尽办法,尽可能的从权重高的网站上获得连接的支持。
    利用某些网站提供交换链接的地方,留下自己的网站链接。
    有条件的可以提供开源程序或者模版等方式,让采用者留有链接。也可以给内容管理系统CMS或Blog系统等开源网站系统提供免费精美模板,并在模板中添加“由×××设计”;为开源网站程序开发插件,并留有作者链接;开发有用的工具,发表并留有下载地址等等

  6. 利用互动平台,巧妙的留下链接
    积极参与问答平台如百度知道、雅虎知识、问问等等,在这些问答中不仅仅能为需要者提供解决问题的方案,同时也留下了该站点的链接。
    参与相关论坛如安全杀毒论坛等。可以为站点添加链接。
    参与社会化wiki平台如百度百科,维基百科等的编辑。 Googlepage建立专业网页并建立指向。
    利用一些交易平台或者交换平台,巧妙的留下自己的链接。

  7. 撰写评论及答疑方面的文章
    利用博客的评论功能,巧妙的留有自己的名称和链接。
    对名人或者某个有影响的事件撰写评论文章,起到推波助澜的作用,逐步扩大事件的站点的影响力。
    对于特定情况下出现的问题或者疑问,撰写文章,留下自己的链接。
    可以对你购买的产品或者广告留下评语,也可以撰写一些推荐信,推荐自己的观点和思维方法等等。

  1. 利用社会关系在特定场合和人物,借机炒作。
    利用社会关系,积极发现在特定场合或者有吸引眼球的地方等等,拍摄名人炒作的照片或者某记录下某句话,然后署上精彩点评或者解说,进行抛砖引玉,当然也可以做成访谈之类的文章,便于快速的传播。
    SEO菜鸟需要掌握的基本SEO技巧如下:
    导航 请确保你的网站导航都是以html的形式链接。所有页面之间应该有广泛的互联,要满足站内任何页面可以通过回连到达主页,如果无法实现这一点,可以考虑建立一个网站地图。
    首页 网站的首页(home或index页等)应该采用文本的形式,而不是flash等。这个文本里面要包含你的目标关键字或目标短语。

    1、建立网站地图
    只要有可能,最好给网站建一个完整的网站地图sitemap。同时把网站地图的链接放在首页上,使搜索引擎能很方便的发现和抓取所有网页。
    2、每个网页最多离首页四次点击就能到达
    3、网站的导航系统最好使用文字链接。
    4、网站导航中的链接文字应该准确描述栏目的内容
    5、整站的PR传递和流动
    6、网页的互相链接 SEO优化基本要点:


1、定义网站的名字,选择与网站名字相关的域名
2、分析围绕网站核心的内容,定义相应的栏目,定制栏目菜单导航
3、根据网站栏目,收集信息内容、整理、修改、创作、添加
4、选择稳定安全,保证网站24小时能正常打开,网速稳定
5、分析网站相关长尾关键词,合理的添加到内容中
6、网站程序采用div+css构造,符合w3网页标准,全站生成静态网页
7、合理交换网站相关的友情链接,不能与搜索引擎惩罚的与行业不相关的网站交换链接
8、制作生成xml与htm的地图,便于搜索引擎对网站内容的抓取
9、为每个网页定义标题、meta标签, 标题简洁,meta围绕主题关键词
10、网站经常更新相关信息内容,禁用采集,手工添置,原创为佳。
11、放置网站统计计算器,分析网站流量是通过什么来的,用户关注什么内容,根据用户的需求,修改、添加,增加用户体验。
12、网站设计美观大方,菜单清晰,网站色彩搭配合理,尽量少用图片、flash、视频等,影响打开速度。

“设计模式”(Design Pattern)是针对编程中经常出现的、具有共性的问题,所提出的解决方法。著名的《设计模式》一书一共提出了23种模式。

Singleton

Singleton模式指的是一个“类”只能创造一个实例。由于JavaScript语言没有类,单个对象可以直接生成,所以实际上,没有必要部署Singleton模式。但是,还是可以做到的。

生成实例的时候,调用getSingleton方法。该方法首先检查_singleton属性是否有值,如果有值就返回这个属性,如果为空则生成新的实例,并赋值给_singleton属性,然后返回这个实例。这样就保证了生成的实例都是同一个对象。

为了保证实例不被改写,可以关闭它的写入开关。

也可以考虑使用Object.preventExtensions()、Object.seal()、Object.freeze()等方法,限制对实例进行写操作。

参考链接

Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.

Quick Start

Create a new post

1
$ hexo new "My New Post"

More info: Writing

Run server

1
$ hexo server

More info: Server

Generate static files

1
$ hexo generate

More info: Generating

Deploy to remote sites

1
$ hexo deploy

More info: Deployment