消除代码全局变量名占用: //本质是使用匿名函数;

void function(x, y, z) {
console.log(x + y + z);
}(1,2,3);

//要使函数内的变量不被释放,需要使用引用;

一次性的构造函数: //维护原型链,保证标识符重写后,实例.constructor仍指向构造器;

var Instance = function() {};
Instance.prototype = {
constructor: Instance
}
Instance = new Instance();
Instance2 = new Instance.constructor(); 

对象充当识别器: //利用对象实例在全局的唯一性

//判断某个标识符是否存在函数内;
var obj = function() {
var yes = {};
var tab = {v1: yes};
return {
query: function(id) { return tab[id] === yes}
}
}();
obj.query('v1'); //true
//判断是外部调用还是内部调用;
var myFunc = function() {
var handle = {};
function _myFunc() {
if(arguments[0] === handle) {
console.log('in');
} else {
console.log('out');
}
}
Array.prototype.unshift.apply(arguments,[handle]);
_myFunc.apply(null,arguments);
return _myFunc;
}
var func = myFunc(); //in
func(); //out

识别构造器调用:

//唯一的问题是如果将构造器赋给实例为方法,则只能判断为new;
function MyObject() {
if(this instanceof arguments.callee) { // this.constructor === arguments.callee ;此方法注意维护constructor
console.log('new');
} else if(this === window) {
console.log('window');
} else {
console.log('object');
}
}
var obj1 = new MyObject(); //new
var obj2 = {}; obj2.func = MyObject;
obj2.func(); //'object'
MyObject(); //'window'

快速调用对象方法:  //使用apply,call;

var obj = {};
[].push.apply(obj,[1,2]);
console.log(obj); //{0:1,1:2,length:2} ,会传入length;
//判断对象的hasOwnProperty属性是否被重写;
var obj = {
hasOwnProperty: function() {}
};
console.log({}.hasOwnProperty.call(obj, 'hasOwnProperty')); //true

//对String,Boolean,Number直接量使用该技巧,由于其会有隐式包装,所以会多一些开销;  

日期计算:

//获取当前对应n天前的时间数据,然后用date的获取方法获取要获取的数据;
var getPrevDay = function (n) {
return new Date(new Date() - n*24*60*60*1000);
}
console.log(getPrevDay(1).getDate());
//获取两天差的时间;

var d1 = new Date(2007,1,1,12,1,30,300);
var d2 = new Date(2006,10,15);
console.log(parseInt((d1-d2)/1000/60/60) + ' h');
console.log(parseInt((d1-d2)/1000/60/60/24) + ' d');

构造复杂对象:

//对象进行值运算;
var obj = {};
obj.valueOf = function() {
return 10;
}
console.log(10 * obj); //100

函数封装为方法:

aObj = {info: 'hello'};
aFunc = function() {console.log(this.info)}; function getMethod(obj, func) {
return function() {
return func.apply(obj);
}
}
m = getMethod(aObj, aFunc); //建立两者关系的函数
m();
//相当于
m2 = aFunc.bind(aObj);
m2();

构造函数参数:

//在当前数组中查找item,找到删除并用插入list,否则在最后插入list
Array.prototype.findAndInsert = function(item, list) {
item = this.indexOf(item);
this.splice.apply(this, [
item < 0 ? this.length : item, 1].concat(list)
);
}
var aPosition = 1, x = 100, y = 200, z = 300;
function foo(v1, v2, v3) {
var args = function() {
return [].splice.call(arguments, aPosition, 0, x, y, z), arguments; //
}.apply(this, arguments);
console.log([].slice.apply(args)); //[11, 100, 200, 300, 22, 33, findAndInsert]
console.log([].slice.apply(arguments)); //[11, 22, 33, findAndInsert]
}
foo(11,22,33);

利用钩子扩充函数功能:

//基本函数扩充
function myFunc1() {
console.log('myFunc1');
}
myFunc1 = function(foo) {
return function() {
console.log('hook');
return foo.apply(this, arguments);
}
}(myFunc1); myFunc1();
//原型方法扩充
Number.prototype.toString = function(foo) {
return function() {
var result = foo.apply(this, arguments).toUpperCase();
console.log('hook');
return result;
}
}(Number.prototype.toString);
//扩充后只执行一次
myFunc2 = function(foo) {
return function() {
myFunc2 = foo; //脱钩
console.log('hook');
return foo.apply(this, arguments);
}
}(myFunc2);

js:语言精髓笔记13--语言技巧的更多相关文章

  1. js:语言精髓笔记5----语言分类

    计算模型:源于对计算过程的不同认识: 1.基于不同计算模型一般分为://教科书的一般分类 命令式语言: 函数式语言: 逻辑式语言: 面向对象程序设计语言: 2.基于程序本质分类:  //编程的经典法则 ...

  2. js:语言精髓笔记12--动态语言特性(2)

    对于括号内: 通过赋值时发生的重写: (Object1 = function() {}).prototype.value = 100; var obj1 = new Object1; console. ...

  3. js:语言精髓笔记11--动态语言特性(1)

    语言:程序最终被表达为数据(结构)和逻辑(算法),命令式和说明式/函数式语言分别从这两方面分类: 动态:在语言陈述时无法确定,必须在计算机执行时才能确定语言关系:JS是完全动态语言,导致其不确定性一般 ...

  4. js:语言精髓笔记9--函数式语言特征

    形式化运算系统的研究: 图灵:提出图灵机形式系统,通过0,1运算系统来解决复杂问题: 冯诺依曼:提出了冯诺依曼体系:即通过修改内存反映运算结果: 阿隆左.丘奇:提出新的运算范型Lambda演算,计算机 ...

  5. js:语言精髓笔记8--对象系统

    封装: 一把对象系统,封装是由语法解析来实现的,即语法作用域:但js是动态语言,因此只能依赖变量作用域: js的变量作用域只有表达式,函数,全局三种:所以js只能实现public和private两种封 ...

  6. js:语言精髓笔记7----原型继承

    面向对象有三个基本特性:封装,继承,多态:如果都满足的话称为面向对象语言:而部分满足则称为基于对象语言: 数据类型实现模型描述: JavaScript对象模型: 构造过程:函数->构造器 构造器 ...

  7. js:语言精髓笔记1--标识符与基本类型

    标识符: 命名: 语法以及类型----语法关键字                                           //逻辑 值(的存储位置)----变量和常量           ...

  8. js:语言精髓笔记10--闭包

    闭包:  //JS函数式风格中,在内部保存数据和对外无副作用这两个特性主要就是通过闭包实现的: 函数与闭包: 一个函数是一段静态代码,它是一个代码书写时已经编译期,静态概念:闭包是函数在代码运行过程中 ...

  9. js:语言精髓笔记6----作用域

    js基础语法:由语句.表达式和变量构成:   语句是主要表达方式:单语句->复合语句(代码块)->程序片段(函数):js中没有单元和程序的概念: 作用域: 语法作用域与变量作用域的区别:前 ...

随机推荐

  1. 高效使用git的一些命令

    1,添加文件到版本库        添加单个文件: git add filename        添加所有txt文件: git add *.txt        添加所有修改文件: git add ...

  2. Ninth scrum meeting - 2015/11/3

    今天课上老师询问了每个团队的进度,我们发现有好多团队都已经基本完成了, 距离预定的alpha版本开发完成时间也越来越近了,我们的工作也都在有条不紊的进行着.今天又出现了git pull时有冲突的情况, ...

  3. django-cms 代码研究(四)CMS_TEMPLATE标签

    CMS_TEMPLATE 继承这个东东可以在实现很灵活的布局,如下:

  4. Redis系列-远程连接redis并给redis加锁

    假设两台redis服务器,ip分别为:192.168.1.101和192.168.1.103,如何在101上通过redis-cli访问103上的redis呢?在远程连接103之前,先讲下redis-c ...

  5. MVC ViewBag和ViewData的区别

    在MVC3开始,视图数据可以通过ViewBag属性访问,在MVC2中则是使用ViewData.MVC3中保留了ViewData的使用.ViewBag 是动态类型(dynamic),ViewData 是 ...

  6. 《ASP.NET1200例》统计网站访问量源代码

    void Application_Start(object sender, EventArgs e)     {        //在应用程序启动时运行的代码        int count=0;  ...

  7. shell脚本去重的几种方法

    测试文件 [root@bogon ~]# cat >test jason jason jason fffffjason 按 Ctr + D保存 1.sort -u [root@bogon ~]# ...

  8. hdu 1098 Lowest Bit 解题报告

    题目链接:http://code.hdu.edu.cn/game/entry/problem/show.php?chapterid=1&sectionid=2&problemid=22 ...

  9. linux(Ubuntu)安装QQ2013

    首先简述自己的系统配置:win7+ ubuntu12.04 linuxQQ 有各种版本,这里介绍两种:linuxQQ 和 wineQQ 1 ------linuxqq是QQ简化版,功能很少,界面很差, ...

  10. JDK1.7 ConcurrentHashMap 源码浅析

    概述 ConcurrentHashMap是HashMap的线程安全版本,使用了分段加锁的方案,在高并发时有比较好的性能. 本文分析JDK1.7中ConcurrentHashMap的实现. 正文 Con ...