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的闭包是如何工作的文章:JimJey的JavaScriptClosures一文,可以在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);
- javaScript循序渐进(3)
- JavaScript循序渐进(1)
- JavaScript循序渐进(2)
- javaScript循序渐进(4)
- 循序渐进理解javascript闭包
- 如何循序渐进的学习javascript
- Linux循序渐进(3)
- 循序渐进
- 循序渐进
- 循序渐进
- 循序渐进
- javascript学习循序渐进体验--Dom体验
- [js] 如何循序渐进地学习Javascript
- SQL循序渐进(3)数据检索
- SilkTest循序渐进3-编程规范
- SilkTest循序渐进3-编程规范
- CSS 循序渐进(一)画个瓢
- CSS循序渐进(一)画个瓢
- struts2学习中的错误集合
- 大学生如何看待挂科
- Android编译Native C的helloworld模块
- 应届生的实习第一天
- 与CSS的{}冲突,修改Smarty的标签
- javaScript循序渐进(3)
- Boost 库中的实用工具类使用入门——boost and STL
- 全国人大和全国政协会议常用词组翻译
- 第一次
- JAVA、ASP.NET(C#) QQ群交流!
- Java Swing-JScrollPane,JTable
- C++ Primer 学习笔记(6): 泛型算法
- 宏展开
- 因素分析法(Factor Analysis Approach)