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

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. Java笔记--泛型总结与详解

    泛型简介: 在泛型没有出来之前,编写存储对象的数据结构是很不方便的.如果要针对每类型的对象写一个数据结构,     则当需要将其应用到其他对象上时,还需要重写这个数据结构.如果使用了Object类型, ...

  2. java笔记--枚举总结与详解

    由于工作原因,已经有两礼拜没有更新博客了,好不容易完成了工作项目,终于又可以在博客园上愉快的玩耍了. 嗯,今天下午梳理了一下关于java枚举的笔记,比较长,不过还是觉得挺厚实的,哈哈,有出入的地方,欢 ...

  3. C# params关键字

    params数组的要点 C#开发语言中 params 是关键字,可以指定在参数数目可变处采用参数的方法参数.在函数的参数数目可变而执行的代码差异很小的时候很有用! class Program { st ...

  4. c++ exports def文件

    https://msdn.microsoft.com/zh-cn/library/hyx1zcd3(v=vs.80).aspx EXPORTS 引入了一个由一个或多个 definitions(导出的函 ...

  5. Android程序启动程序与页面的跳转

    package login; import com.example.login.R; import android.app.Activity; import android.content.Inten ...

  6. 搭建自己的SIP服务器:开源sip服务器opensips的搭建及终端TwInkle的使用

    搭建自己的SIP服务器:开源sip服务器opensips的搭建及终端TwInkle的使用 分类: linux编译相关2013-01-05 21:38 17983人阅读 评论(24) 收藏 举报 先下载 ...

  7. 【SpringMVC】SpringMVC系列13之关于 mvc:annotation-driven

    13.关于 mvc:annotation-driven 13.1.概述      会自动注册RequestMappingHandlerMapping.RequestMappingHandlerAdap ...

  8. order by 指定顺序 mysql

    LOCATE(substr,str), LOCATE(substr,str,pos) 第一个语法返回字符串str第一次出现的子串SUBSTR的位置.第二个语法返回第一次出现在字符串str的子串SUBS ...

  9. 66. 有序数组构造二叉搜索树[array to binary search tree]

    [本文链接] http://www.cnblogs.com/hellogiser/p/array-to-binary-search-tree.html [题目] 编写一个程序,把一个有序整数数组放到二 ...

  10. Java异常与异常处理简单使用

    异常就是程序运行过程中阻止当前方法或作用域继续执行的问题: 任何程序都不能保证完全正常运行,当发生异常时,需要我们去处理异常,特别是一些比较重要的场景,异常处理的逻辑也会比较复杂,比如:给用户提示.保 ...