JavaScript学习笔记-函数实例
函数实例
var p = {
a:15,
b:'5',
f1:function(){
var self = this;
console.log(self.a+self.b);
f2();
function f2(){
console.log(self.a-self.b);
}
return self; //返回this,方便对对象p进行链式调用
},
m1:function(n1,n2){
this.a = n1>this.a?n1:this.a;
this.b = n2>this.b?n2:this.b;
return this;
}
};
p.m1('23','r').f1();
//=======sum()可接收任意个数,任意类型参数,将有效数字求和,若为不可计算对象设为0==========
function sum(){
var arg = arguments.length;
var sum = 0;
for(var i = 0;i<arg;i++){
var s = Object.prototype.toString.call(arguments[i]).slice(8,-1);
if(s === 'Number'||s ==='String'||s ==='Boolean'||s ==='Array'){
arguments[i] =
arguments[i] - 0 ||
Array.prototype.reduce.call(
arguments[i],
function (x, y) {
x = x - 0 || 0;
y = y - 0 || 0;
return x + y;
}) ||
0;
sum += arguments[i];
}
else {
sum += 0;
}
}
return sum;
} var a = 'b3c',b = 4,c = true,d=[,5,'q'];
var num1 = {a:1,b:2,c:3,d:'m'};
console.log('数字求和等于: '+sum(c,num1,a,b,d,/./));
console.log(a);
//====
function sum1(a){
var total = 0;
for(var i = 0;i<arguments.length;i++){
var a = arguments[i],n;
if(a==null) continue;
if(Array.isArray(a)) n = sum1.apply(this,a);
else if(typeof a === 'function') n = Number(a());
else n = Number(a);
total += n;
}
return total;
}
console.log(sum1([9,8,7,'6'],4));
//=====
var operators = {
add:function(a,b){return a+b;},
substract:function(a,b){return a-b;},
multiply:function(a,b){return a*b;},
divide:function(a,b){return a/b;},
pow:Math.pow
};
function operate(operator,a,b){
if(typeof operators[operator]==='function')
return operators[operator](a,b);
else throw new Error('unknown operator!');
}
console.log(operate('divide',20,4));
//=====
(function(){
console.log('这里立即执行函数');
}());
//======特定场景下返回不同版本的extend或者extend2
var extend = (function(){
for(var p in {toString:null}){
return function extend(o){
for(var i=1;i<arguments.length;i++){
var source = arguments[i];
for(var prop in source) o[prop] = source[prop];
}
return o;
};
}
var protoprops = ['toString','valueOf','constructor','hasOwnProperty','isPropertyOf','propertyIsEnumerable','toLocaleString'];
return function extend2(o){
for(var i=1;i<arguments.length;i++){
var source =arguments[i];
for(var prop in source) o[prop] = source[prop];
for(var j=0;j<protoprops.length;j++){
prop = protoprops[j];
if(source.hasOwnProperty(prop)) o[prop] = source[prop];
}
}
return o;
};
}());
var b1 = {a:1,b:2},b2 = {c:3,d:4};
console.log(extend); //[Function: extend]
console.log(extend(b1,b2)); //{ a: 1, b: 2, c: 3, d: 4 }
//=====
var uniq = (function(){
var c = 0;
return function(){return c++;};
}());
console.log(uniq());//0
console.log(uniq());//1
//=====无法从外部访问闭包内的局部变量,只有闭包内的方法可以访问
function couter(){
var c=0;
return {
count: function() {return ++c;},
reset: function() {return c=0;}
};
}
var couter1 = couter() , couter2 = couter(); //创建不同的函数对象,他们互不干扰
console.log(couter1.count());//1
console.log(couter2.count());//1
console.log(couter1.reset());//0
console.log(couter1.count());//1
console.log(couter2.count());//2
//=========
function addPrivateProperty(o,name,predicate){
var value;
o['get'+name] = function(){return value;};
o['set'+name] = function(v){
if(predicate && !predicate(v)){
throw Error('set'+name+':invalide value '+v);
}else value = v;
};
}
var o = {};
addPrivateProperty(o,'Name',function(x){return typeof x == 'string';});
o.setName('Frank');
console.log(o);
//=========面向对象的模块化编程(初探)======
var Module = (function(){
var myModule = {}; //创建私有对象,被返回后变公共对象
var _privateMethod = function(){return '_private';}; //私有方法
myModule.publicMethod1 = function(){console.log('content a '+_privateMethod()+' and myself public_By_myModule');};
var publicMethod2 = function(){console.log('public_By_return');};
return{
myModule:myModule,
publicMethod2:publicMethod2,
publicMethod3:function(){console.log('public');}
}
})();
Module.myModule.publicMethod1();
Module.publicMethod2();
Module.publicMethod3();
//=============bind()
var sum3 = function(x,y){return x+y;};
var succ = sum3.bind(null,1); //x=1
succ(2); //3,其中y=2
function f(x,y,z){return this.x+y+z;}
var g = f.bind({x:1},2); //x=1,y=2
g(3); //6,z=3
f.bind({x:1},2,3)(); //6,立即执行函数
//======函数式编程:单独定义一些重复利用的基础功能函数并保存为变量,然后在实际应用中引用他们
var sum4 = function(x,y){return x+y;};
var square = function(x){return x*x;};
var data = [1,1,3,4,4];
var mean = data.reduce(sum4)/data.length;
var deviations = data.map(function(x){return x-mean;});
var stddev = Math.sqrt(deviations.map(square).reduce(sum4)/(data.length-1));
function compose(f1,f2){
return function(){return f1.call(this,f2.apply(this,arguments));};
}
compose(square,sum4)(2,3); //25
//======
//=====不完全函数f的调用:
function array(a,n){return Array.prototype.slice.call(a,n||0);}
var f = function(x,y,z){return x*(y-z)}; function partialLeft(f /*,...*/){
var args = arguments;
return function(){
var a = array(args,1);
a = a.concat(array(arguments));
return f.apply(this,a);
};
}
console.log( partialLeft(f,2)(3,4) ); //-2, 其中a=[2,3,4] function partialRight(f /*,...*/){
var args = arguments;
return function(){
var a = array(arguments);
a = a.concat(array(args,1));
return f.apply(this,a);
};
}
console.log( partialRight(f,2)(3,4) ); //6,其中a=[3,4,2] function partial(f /*,...*/){
var args = arguments;
return function(){
var a = array(args,1);
var i = 0, j = 0;
for(;i< a.length;i++){
if(a[i] === undefined) a[i] = arguments[j++]; //每次循环后,若if条件为true,j也+1
}
a = a.concat(array(arguments,j));
return f.apply(this,a);
};
}
console.log(partial(f,2,undefined,3)(5,9)); //4,其中a=[2,5,3] //======缓存技术的应用:检查要计算的参数,看是否在缓存内有用同样的参数计算过,若有则返回缓存的计算结果,避免重复计算
function memorize(){
var cache = {}; //用来缓存的对象
return function (f) {
var args = Array.prototype.slice.call(arguments,1);
var key = arguments.length-1 + ':' + f + args.join('-');
if (key in cache) return cache[key];
else {
cache[key] = f.apply(this,args); //若缓存内不存在key,则创建这个key并赋值
console.log(cache);
return cache[key];
}
};
}
var add = function(x,y){return x+y;};
var divide = function(x,y){return x-y;};
var memo = memorize();
memo(add,4,5);
memo(Math.pow,4,5);
memo(divide,4,5);
//===
function memorize2(f){
var cache2 = {};
return {
cheakMemo:function() {
var key = arguments.length + ':(' + Array.prototype.join.call(arguments, ',') + ')';
if (key in cache2) return cache2[key];
else {
cache2[key] = f.apply(this, arguments);
console.log(cache2);
return cache2[key];
}
},
cache2:cache2
};
}
var memo = memorize2(add);
memo.cheakMemo(4,5); //{ '2:(4,5)': 9 }
memo.cheakMemo(4,5); //直接取缓存的值,不计算
memo.cheakMemo(4,6); //{ '2:(4,5)': 9, '2:(4,6)': 10 }
memo.cheakMemo(4,7); //{ '2:(4,5)': 9, '2:(4,6)': 10, '2:(4,7)': 11 }
JavaScript学习笔记-函数实例的更多相关文章
- JavaScript学习笔记-函数
函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...
- JavaScript学习笔记——函数
javascript函数的声明和调用 将完成某一特定功能的代码集合起来,可以重复使用的代码块. 一.函数的声明方式(创建) A.基本语法 function 关键字 function 函数名([参数1] ...
- JavaScript:学习笔记(5)——箭头函数=>以及实践
JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...
- Java程序猿JavaScript学习笔记(2——复制和继承财产)
计划和完成在这个例子中,音符的以下序列: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaSc ...
- Java程序猿JavaScript学习笔记(4——关闭/getter/setter)
计划和完成这个例子中,音符的顺序如下: Java程序猿的JavaScript学习笔记(1--理念) Java程序猿的JavaScript学习笔记(2--属性复制和继承) Java程序猿的JavaScr ...
- JavaScript:学习笔记(9)——Promise对象
JavaScript:学习笔记(9)——Promise对象 引入Promise Primose是异步编程的一种解决方案,比传统的解决方案回调函数和事件更加合理和强大.如下面为基于回调函数的Ajax操作 ...
- JavaScript:学习笔记(6)——New运算符
JavaScript:学习笔记(6)——New运算符 new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例. 快速开始 当你使用new关键字的时候,会 创建一个新的对象 将th ...
- JavaScript:学习笔记(2)——基本概念与数据类型
JavaScript:学习笔记(2)——基本概念与数据类型 语法 1.区分大小写.Test 和 test 是完全不同的两个变量. 2.语句最好以分号结束,也就是说不以分号结束也可以. 变量 1.JS的 ...
- JavaScript学习11 数组排序实例
JavaScript学习11 数组排序实例 数组声明 关于数组对象的声明,以前说过:http://www.cnblogs.com/mengdd/p/3680649.html 数组声明的一种方式: va ...
随机推荐
- poj1330Nearest Common Ancestors 1470 Closest Common Ancestors(LCA算法)
LCA思想:http://www.cnblogs.com/hujunzheng/p/3945885.html 在求解最近公共祖先为问题上,用到的是Tarjan的思想,从根结点开始形成一棵深搜树,非常好 ...
- CentOS yum安装Apache + PHP + Tomcat7 + MySQL
Linux平台上用得最多的web环境就是php.java和MySQL了,会搭建这个环境,就能把很多开源程序跑起来. 作为一个程序猿,虽然并不用精通运维的活,但基本的Linux环境搭建还是要掌握比较好, ...
- Ext.Net全部Icon图标名称展示
- Android进程间通信之LocalSocket通信
LocalSocket,在Unix域名空间创建的一个套接字(非服务端). 是对Linux中Socket进行了封装,采用JNI方式调用,实现进程间通信. 具体就是Native层Server和Framew ...
- Elasticsearch——Search的基本介绍
Elasticsearch最常用的方法莫过于查询了.Es支持以URI请求参数或者请求体的方式进行查询. 查询范例 Elasticsearch支持对多索引以及多类型进行查询. 比如,下面对某个特定索引的 ...
- 第18/24周 乐观并发控制(Optimistic Concurrency)
大家好,欢迎回到性能调优培训.上个星期我通过讨论悲观并发模式拉开了第5个月培训的序幕.今天我们继续,讨论下乐观并发模式(Optimistic Concurrency). 行版本(Row Version ...
- C# 异常捕获机制(Try Catch Finally)
一.C#的异常处理所用到关键字 try 用于检查发生的异常,并帮助发送任何可能的异常. catch 以控制权更大的方式处理错误,可以有多个catch子句. finally 无论是否引发了异常,fina ...
- html的<meta>标签的作用
<meta>标签包含了页面文档的上下文信息. 主要包含的上下文信息: 1.配置了服务器向浏览器响应时,http协议的head信息,浏览器根据head执行相应操作. 2.对页面的描述信息,便 ...
- Winform开发框架里面使用事务操作的原理及介绍
在很多情况下,事务是个很有用的东西,可以把一系列的操作组合成一个原子粒度的操作,一旦组合中某个地方出错,可以整个干净的进行滚回,不会留下脏数据:除此之外,事务还能提高批量操作的效率,如在本地SQLit ...
- js页面用定时任务通过AJAX获取后台数据,但是从这个页面跳转到其他页面后,定时任务仍然在定时请求后台
setInterval(function(){//ajax 请求后台数据},1000);这个是A页面的定时器然后我在A页面通过其他请求跳转到其他页面之后后台发现A页面的定时器的那个请求仍然在执行为什么 ...