javascript语言精粹(函数2)

来源:互联网 发布:淘宝的一件代发是怎么 编辑:程序博客网 时间:2024/06/05 01:18

闭包

作用域的好处是内部函数可以访问它们外部函数的参数和变量(除了this和argumengts)

之前我们构造了一个myobject对象,它拥有一个value属性和一个Increment方法。假定我们希望保护该值不被非法更改。
和以对象字面量形式去初始化myObject不同,我们通过一个函数的形式去初始化myObject,该函数会返回一个对象字面量。函数里定义了一个value变量。该变量对Increment和getvalue方法总是可用的,但函数的作用域使得它对其他的程序来说是不可见的。

var myObject=(function(){        var value=0;        return{            increment:function(inc){                value+=typeof inc==='number'?inc:1;            },            getValue:function(){                return value;            }        }    }());

我们并没有把一个函数赋值给myObject。我们是把调用该函数后返回的结果赋值给它。注意最后一行的()。该函数返回一个包含两个方法的对象,并且这些方法继续享有访问value变量的特权。

 var quo=function(status){        return{            get_status:function(){                return status;            }        }    }    //构造一个quo实例    var myQuo=quo("amazed");    document.write(myQuo.get_status());

这个quo函数被设计成无需在前面加上new来u用,所以名字也没有首字母大写。当我们调用quo时,它返回包含get_status方法的一个新对象。该对象的一个引用保存在myQuo中,即使quo已经返回了,但get_status仍然享有访问quo对象的status属性的特权。get_status方法并不是访问该参数的一个副本,它访问的就是该参数本身。这是可能的。因为该函数可以访问它被创建时所处的上下文环境,这被称为闭包。

var fade=function(node){        var level=1;        var step=function(){            var hex=level.toString(16);            node.style.background: '#ffffff'+hex+hex;            if(level<1){                level+=1;                setTimeout(step,100);            }        };        setTimeout(step,100);    }    fade(document.body);

我们调用fade,把document.body作为参数传递给它(HTML标签所创建的节点)fade函数设置level为1.它定义了一个step函数,接着用来调用setTimeout,并传递step函数和一个时间(100毫秒)给它。然后它返回,fade函数结束。

在大约十分之一秒后,step函数被调用。它把fade函数的level变量转化为16位字符。接着,它修改fade函数得到节点的背景颜色。然后查看fade函数的level变量。如果背景色尚未变成白色,那么它增大fade函数的level变量,接着用setTimeout预定让它自己再次运行。

step函数很快再次被调用。但这次,fade函数的level变量值变成2.fade函数在之前已经返回了,但只要fade的内部函数需要,它的变量就会持续保持。
//构造一个函数,用正确的方式给一个数组中的节点设置时间处理程序

//点击一个节点,将会弹出一个对话框显示节点的序号

 var number=function(ul){        var helper=function(i){            return function(e){                alert(i);            }        }        var i;        for(i=0;i<nodes.length;i++){            nodes[i].onclick=helper(i);        }    }

回调
模块
我们可以使用函数和闭包来构造模块。模块是一个提供接口却隐藏状态与实现的函数或对象。通过使用产生模块,我们几乎可以完全摒弃全局变量的使用,

原创粉丝点击