从javascript的两个例子谈开

今天是研究javascript的闭包问题,看到这么一个非常好的文章

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html?20110419152835

文章最后留了两个题目:

如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。

代码片段一。

var name = "The Window";

var object = { 
name : "My Object",

getNameFunc : function(){ 
return function(){ 
return this.name; 
};

}

};

alert(object.getNameFunc()());

代码片段二。

var name = "The Window";

var object = { 
name : "My Object",

getNameFunc : function(){ 
var that = this; 
return function(){ 
return that.name; 
};

}

};

alert(object.getNameFunc()());

这两个例子相当精简

这里记录下对这两个例子的理解:

理解最后两个例子:

1 函数中的this指的是调用这个函数的owner 
2 object.getNameFunc()是返回一个函数,并没有执行函数中的代码 
3 增加一个例子0: 
var name = "The Window"; 
var object = { 
name : "My Object", 
getNameFunc : function(){ 
return (this.name); 

}; 
var name = object.getNameFunc(); 
alert(name);

4 把例子1变成 
var name = "The Window"; 
var object = { 
name : "My Object", 
getNameFunc : function(){ 
return function(){ 
return this.name; //这个this是有上下文的限制的 
}; 

}; 
var tmp = Object.getNameFunc(); //此时没有执行this.name 
var name = tmp();//这个时候才执行,这时候的this上下文为全局 
alert(name); 
//alert(object.getNameFunc()())

5 把例子2变成: 
var name = "The Window";

var object = { 
name : "My Object",

getNameFunc : function(){ 
var that = this; 
return function(){ 
return that.name; 
}; 

}; 
var tmp = Object.getNameFunc(); //这个时候执行了that = this,这里的this上下文是object,所以that指的是object 
var name = Object.getNameFunc(); //这个时候执行了that.name 
alert(name); 
//alert(object.getNameFunc()());

这里面最难理解的应该是this的上下文

时间: 2024-08-04 12:15:13

从javascript的两个例子谈开的相关文章

分享JavaScript与Java中MD5使用两个例子_javascript技巧

在网上查了一下,在网上收集了Java与JavaScript中使用的两个例子,试验过,分享下.1.Java: package org.bearfly.test.md5; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Utils { public static

CAAI演讲实录丨李德毅院士:交互认知——从图灵测试的漏洞谈开去

8月26日至27日,在中国科学技术协会.中国科学院的指导下,由中国人工智能学会发起主办.中科院自动化研究所与CSDN共同承办的2016中国人工智能大会(CCAI 2016)在北京辽宁大厦盛大召开,这也是本年度国内人工智能领域规模最大.规格最高的学术和技术盛会,对于我国人工智能领域的研究及应用发展有着极大的推进作用. 27日上午的第一个主题报告,是中国工程院院士.中国人工智能学会理事长李德毅的<交互认知--从图灵测试的漏洞谈开去>.李德毅院士首先从图灵测试在面对自闭症的情形.手机交互认知.教育的

从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势

在上一篇文章中我们简单探讨了.NET 1.x和.NET 2.0中委托表现形式的变化,以及.NET 2.0中匿名方法的优势.目的及注意事项.那么现在我们来谈一下.NET 3.5(C# 3.0)中,委托的表现形式又演变成了什么样子,还有什么特点和作用. .NET 3.5中委托的写法(Lambda表达式) Lambda表达式在C#中的写法是"arg-list => expr-body","=>"符号左边为表达式的参数列表,右边则是表达式体(body).参数列表

一起谈.NET技术,从.NET中委托写法的演变谈开去(中):Lambda表达式及其优势

在上一篇文章中我们简单探讨了.NET 1.x和.NET 2.0中委托表现形式的变化,以及.NET 2.0中匿名方法的优势.目的及注意事项.那么现在我们来谈一下.NET 3.5(C# 3.0)中,委托的表现形式又演变成了什么样子,还有什么特点和作用. .NET 3.5中委托的写法(Lambda表达式) Lambda表达式在C#中的写法是"arg-list => expr-body","=>"符号左边为表达式的参数列表,右边则是表达式体(body).参数列表

javascript学习笔记_浅谈基础语法,类型,变量_基础知识

基础语法.类型.变量 非数字值的判断方法:(因为Infinity和NaN他们不等于任何值,包括自身) 1.用x != x ,当x为NaN时才返回true; 2.用isNaN(x) ,当x为NaN或非数字值时,返回true; 3.用isFinity(x),在x不是NaN.Infinity.-Infinity时返回true; 虽然(字符串.数字.布尔值)不是对象,他们的属性是只读的,但也可以像操作对象一样来引用他们的属性和方法,原理: javascript构造一个(String.Number.Boo

Javascript 判断两个IP是否在同一网段实例代码_javascript技巧

Javascript 判断两个IP是否在同一网段 以下脚本不做IP格式的判断,只判断两个IP是否在同一网段. 例子,Javascript判断两个IP是否在同一网段. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> IP段信息检测_www.manongjc.com </TITLE> <script la

TopList标签和JavaScript结合两例_javascript技巧

 (SteamCMS)Fish模版专贴一:TopList标签和JavaScript结合两例 首先可以先参考 SteamCMS 标准模版标签说明 来了解一下TopList标签及其属性. 在Top列表的记录前加上数字(当然也可以是图片,这里只是简单的举个例子). 原理说明:先在最前面初始化一个js变量,在TopList中间,将Js变量加1,并在TopList循环体中间输出(我写asp代码一样的道理) 关键代码:  <body> <script language="javascrip

JavaScript数据操作_浅谈原始值和引用值的操作本质_javascript技巧

我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两个不同的概念.例如,null是null类型的唯一值.undefined是undefined类型的唯一值.而true和false是boolean类型仅有的两个值等.在任何语言中,值的操作都可以归纳为以下3个方面. 复制值:即把值赋值给新变量,或者通过变量把值赋值给另一个变量.属性或数组元素. 传递值:

JavaScript获取两个数组交集的方法

  本文实例讲述了JavaScript获取两个数组交集的方法.分享给大家供大家参考.具体如下: 这里传入的数组必须是已经排过序的 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /* finds the intersection of * two arrays in a simple fashion. * * PARAMS * a - first array, must alre