源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

JavaScript函数详解

  • 时间:2020-10-12 22:21 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JavaScript函数详解
[b]1、函数定义 [/b]  函数包含一组语句,它们是javascript的基础模块单元,用于代码复用、信息隐藏和组合调用。函数用于指定对象的行为 [b]2、函数的四种调用模式及this的初始化 [/b] [b]第一种:方法调用模式[/b]     以下事例证明通过方法调用模式调用时,this绑定到拥有该方法的对象。如:
[url=#] <a href="#" name="test">点击我...</a><br> // 点击时显示3 <a href="#" name="test">点击我...</a><br> // 点击时显示3 var add_the_handlers = function(nodes){     var i;     for(i = 0; i < nodes.length; i += 1) {         nodes[i].onclick = function(e){ // 函数构造时的:i             alert(i);         };     } }; var objs = document.getElementsByName("test"); add_the_handlers(objs); // 造成上面的原因是:a标签的事件函数绑定了变量i,则不是函数在构造时的i值。 // 解决方案如下: var add_the_handlers = function(nodes){     var i;     for(i = 0; i < nodes.length; i += 1) {         nodes[i].onclick = function(i){             return function(e){                 alert(i); // 输出的i是构造函数传递进来的i,不是事件处理绑定的i。             };         }(i);     } }; var objs = document.getElementsByName("test"); add_the_handlers(objs);
[b]11、回调(callbacks)[/b] [b]12、模块[/b]     模块是一个提供接口而隐藏状态和实现的函数或对象。     一般形式:一个定义了私有变量和函数的函数;利用闭包创建可以访问私有变量和函数的特权函数;最后返回这个特权函数,或者把他们保存到一个可以被访问到的地方。
[u]复制代码[/u] 代码如下:
Function.prototype.method = function(name,func){     this.prototype[name] = func;     return this; }; String.method("deentityify",function(){     var entity = {         quot : '"',         lt   : '<',         gt   : '>'     };     return function(){         return this.replace(/&([^&;]+);/g, function(a, b){ // 怎样知道a、b的值,了解正则表达式             var r = entity[b];             return typeof r === "string" ? r : a;         });     }; }()); alert("<">".deentityify()); // 测试:<">
注:模块模式通常结合单例模式使用,JavaScript的单例模式就是用对象字面量方式创建的对象,对象的属性值可以是数值或函数,并且属性值在该对象的生命周期中不会发生变化。 [b]13、级联(链式操作)[/b]     对于一些不返回值的方法,我们返回this,而不是undefined,那么我们就可以启动以级联(链式)去操作该对象。如下:
[u]复制代码[/u] 代码如下:
var $ = function(id){     var obj = document.getElementById(id);     obj.setColor = function(color){         this.style.color = color;         return this;     };     obj.setBgColor = function(color){         this.style.backgroundColor = color;         return this; // 返回this对象,启动级联     };     obj.setFontSize = function(size){         this.style.fontSize = size;         return this;     };     return obj; }; $("test").setColor("red")          .setFontSize("30px")          .setBgColor("blue"); // 改进后的代码: (function(id){     var _$ = function(id){         this.element = document.getElementById(id);     };     _$.prototype = {         setColor : function(color){             this.element.style.color = color;             return this;         },         setBgColor : function(color){             this.element.style.backgroundColor = color;             return this;         },         setFontSize : function(size){             this.element.style.fontSize = size;             return this;         }     };          // 添加到window原型链中     window.$ = function(id){         return new _$(id);     }; })(); $("test").setColor("red")          .setFontSize("30px")          .setBgColor("blue");
[b]14、套用[/b]     所谓套用就是将函数与传递给它的参数相结合,产生一个新的函数。如:下面代码中定义一个add()函数,该函数能够返回一个新的函数,并把参数值传递给这个新函数,从而实现连加操作。
[u]复制代码[/u] 代码如下:
// 第一种方式: var add = function(a){     return function(b){         return a + b;     } }; alert(add(1)(2)); // 3 // 第二种方式:用arguments实现 var add = function(){     var arg = arguments;     return function(){         var sum = 0;         for(var i=0; i<arg.length; i++){             sum += arg[i];         }         for(i=0; i<arguments.length; i++){             sum += arguments[i];         }         return sum;     } }; alert(add(1,2,3)(4,5,6)); // 21 // 第三种方式:通过一个套用方法(curry)实现 var add = function(){     var sum = 0;     for(var i=0; i<arguments.length; i++){         sum += arguments[i];     }     return sum; }; // 添加方法到Function的原型链上 Function.prototype.method = function(name, func){     this.prototype[name] = func;     return this; }; // 套用方法 Function.method('curry', function(){     // 通过数组Array的slice方法,使得arguments也具有concat方法     var slice = Array.prototype.slice,         args = slice.apply(arguments), that = this;     return function(){         return that.apply(null, args.concat(slice.apply(arguments)));     }; }); alert(add.curry(1,2)(3,4)); // 10
[b]15、记忆[/b]     函数可以用对象去记住先前操作的结果,从而能避免无谓的运算。这种优化被称为记忆。
[u]复制代码[/u] 代码如下:
var fibonacci = function(){     var mome = [0,1]; // 存放计算后的数据     var fib = function(n){         var result = mome[n];         // 如果不存在被计算过的数据,则直接计算。然后在将计算结果缓存         if(typeof result !== 'number'){             result = fib(n-1) + fib(n-2);             mome[n] = result;         }         return result;     };     return fib; }(); for(var i=0; i<=10; i++){     document.writeln("// " + i + ": " + fibonacci(i) + "<br/>"); } //========================== // 创建一个具有记忆的函数 //========================== var memoizer = function(memo, fundamental){     var shell = function(n){         var result = memo[n];         if(typeof result !== "number"){             result = fundamental(shell, n);             memo[n] = result;         }         return result;     };     return shell; }; // 通过记忆函数memoizer完成斐波那契数列 var fibonacci = memoizer([0,1], function(shell, n){     return shell(n-1) + shell(n-2); }); // 通过记忆函数memoizer完成阶乘 var factorial = memoizer([1,1], function(shell, n){     return n * shell(n-1); }); for(var i=0; i<=15; i++){     document.writeln("// " + i + ": " + factorial(i) + "<br/>"); }
小伙伴们看明白了没,非常实用吧,如有遗漏的地方,还请大神们指点下,共同进步
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部