javaScript循序渐进(3)

来源:互联网 发布:微信分销商城源码 编辑:程序博客网 时间:2024/05/16 08:48

<!--@page { margin: 2cm }P { margin-bottom: 0.21cm }-->

闭包(closure

闭包意味着内层的函数可以引用存在于包围他的函数内的变量,即使外层函数的执行已经终止。这个特性非常强大和复杂。

 

例如:闭包如何使代码更清晰的两个例子

找出ID为‘main’的元素

varobj=document.getElementById("main");

修改它的border样式

obj.style.border = "1px solidred";

初始化一个在一秒后执行的回调函数(callback)

setTimeout(function(){

她将隐藏此对象

obj.style.display = 'none';

},1000);

 

一个用于延时显示警告信息的通用函数

function delayedAlert(msg, time){

初始化一个封装的回调函数

setTimeout(function(){

她将包含本函数的外围函数传入的msg变量

alert(msg);

},time);

}

 

用两个参数调用delayedAlert函数

delayedAlert("zhangxinagrong",2000);

 

在一些函数式程序设计语言里,有一种称为Curry化得技术。本质上,Curry化是一种通过把多个参数填充到函数体中,实现将函数转换为一个新的经过简化的(使之接受的参数更少)函数的技术。

 

例如:用闭包实现的函数Curry

数字求和函数的函数生成器

function addGenerator(num){

返回一个简单的函数,求两个数字的和,其中第一个数字来自生成器

return function(toAdd){

return num + toAdd;

};

}

addFive现在包含一个接受单一参数的函数,这个函数能求得5加上该参数的和

var addFive = addGenerator(5);

这里我们可以看到,在传入参数为4时,addFive函数的结果是9

alert(addFive(4)==9);

 

闭包还能解决另一个常见JavaScript编写问题。

通过自执行的匿名函数你可以把所有原本属于全局的变量都隐藏起来。

 

例如:使用匿名函数来隐藏全局作用域变量的例子

创建一个新的匿名函数,作为包装

(function(){

变量原本应该是全局的

var msg = "Thankszhangxiangrong";

将一个新函数绑定到全局对象

window.onunload = function(){

这个函数使用了“隐藏”的msg变量

alert(msg);

};

关闭匿名函数并执行之

})();

 

闭包的概念不容易理解和掌握。

推荐一篇精彩的解释JavaScript的闭包是如何工作的文章:JimJeyJavaScriptClosures一文,可以在http://jibbering.com/faq/faq_notes/closures.html中找到。

 

上下文对象(context

它是构筑JavaScript面向对象功能的基础。

 

上下文对象是通过this变量体现的,这个变量永远指向当前代码所处的对象中。

回忆一下,全局对象其实是window对象的属性。这意味着即使是在全局上下文中,this变量也能指向一个对象。

 

例如:在上下文对象内使用函数并将其上下文对象切换为另一个变量

var obj = {

yes: function(){

//this==obj

this.val=true;

},

no: function(){

this.val=false;

}

};

我们发现“obj”对象没有val属性

alert(obj.val==null);

执行了yes函数后,将val属性和'obj'对象关联起来

obj.yes();

alert(obj.val==true);

不过,现在我们把window.no指向obj.no并执行之

window.no = obj.no;

window.no();

结果obj对象的val不变(因为no的上下文已经改变为window对象了)

alert(window.val == false);