function Jquery(){
this.name = 'ysr';
this.sex = 'man';
return {
x: this,
age : 26
} } var b = new Jquery(); //b => {x:Jquery, age:26}
//b.x = Jquery;
//b.x.name = 'ysr';
//b.x.sex = 'man' var b = Jquery();
//b.x = window;

  若果里面没return 的话;

function Jquery(){
this.name = 'ysr';
this.sex = 'man'; }
var a = new Jquery(); //a={name:'ysr',sex:'man'}

  什么是闭包(closure function )

Two one sentence summaries:

  • a closure is the local variables for a function — kept alive after the function has returned, or
  • a closure is a stack-frame which is not deallocated when the function returns (as if a 'stack-frame' were malloc'ed instead of being on the stack!).
function sayHello(name){
var text = "Hello " + name;
function say(){ //函数里面定义函数
console.log(text);
}
return say;
} var aa = sayHello('ysr'); aa(); // Hello ysr;

  

function sayHello(name){
var text = "Hello " + name;
var say = function(){ //the anonymous function
console.log(text);
}
return say;
} var aa = sayHello('yangyu'); aa();

  

Whenever you see the function keyword within another function, the inner function has access to variables in the outer function.

function foo(x) {
var tmp = 3; function bar(y) {
console.log(x + y + (++tmp)); // will log 16
} bar(10);
} foo(2); //This will always log 16, because bar can access the x which was defined as an argument to foo, and it can also access tmp from foo. //That is a closure. A function doesn't have to return in order to be called a closure. Simply accessing variables outside of your immediate lexical scope creates a closure.

  上面这个例子,变一下, 返回出来。!!

//The above function will also log 16, because bar can still refer to x and tmp, even though it is no longer directly inside the scope
function foo(x) {
var tmp = 3; return function (y) {
console.log(x + y + (++tmp)); // will also log 16
}
} var bar = foo(2); // bar is now a closure.
bar(10); //16
bar(10) //17

 The simplest example of a closure is this: 

var a = 10;
function test() {
console.log(a); // will output 10
console.log(b); // will output 6
}
var b = 6;
test();

  

When a JavaScript function is invoked, a new execution context is created. Together with the function arguments and the parent object, this execution context also receives all the variables declared outside of it (in the above example, both 'a' and 'b').

It is possible to create more than one closure function, either by returning a list of them or by setting them to global variables. All of these will refer to the same x and the same tmp, they don't make their own copies.

Here the number x is a literal number. As with other literals in JavaScript, when foo is called, the number x is copied into foo as its argument x.

On the other hand, JavaScript always uses references when dealing with objects. If say, you called foo with an object, the closure it returns will reference that original object!

function foo(x) {
var tmp = 3; return function (y) {
console.log(x + y + tmp);
x.memb = x.memb ? x.memb + 1 : 1;
console.log(x.memb);
}
} var age = new Number(2);
var bar = foo(age); // bar is now a closure referencing age.
bar(10);
//15
//1 bar(10) //15
//2

  

function makeKitchen () {
var trashBags = ['A', 'B', 'C']; // only 3 at first return {
getTrashBag: function() {
return trashBags.pop();
}
};
} var kitchen = makeKitchen(); kitchen.getTrashBag(); // returns trash bag C
kitchen.getTrashBag(); // returns trash bag B
kitchen.getTrashBag(); // returns trash bag A

  

 

As expected, each call to bar(10) will increment x.memb. What might not be expected, is that x is simply referring to the same object as the age variable! After a couple of calls to barage.memb will be 2! This referencing is the basis for memory leaks with HTML objects.

javascript 闭包理解例子的更多相关文章

  1. 对于 Javascript 闭包理解

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...

  2. JavaScript闭包理解的关键 - 作用域链

    阮一峰的一篇文章已经对闭包的用途.概念讲解地相对清晰了. 闭包就是能够读取其他函数内部变量的函数. 但我认为里面对于作用域链的解释还不够清晰,这里作一些补充. 闭包之所以可以读取外部函数的内部变量,即 ...

  3. javascript 闭包理解

    摘自:http://www.cnblogs.com/jkswjw/p/3180384.html javascript 闭包基础分享 闭包向来给包括JavaScript程序员在内的程序员以神秘,高深的感 ...

  4. javascript闭包理解

    //闭包理解一 function superFun(){ var _super_a='a'; function subfuc(){ console.log(_super_a); } return su ...

  5. JavaScript 闭包的例子

    例子出自<<JavaScript权威指南>>, 加上个人的理解和总结, 欢迎交流! /********************************************* ...

  6. JavaScript闭包理解【关键字:普通函数、闭包、解决获取元素标签索引】

    以前总觉得闭包很抽象,很难理解,所以百度一下"闭包"概览,百度的解释是:“闭包是指可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的 ...

  7. javascript闭包学习例子

    javascript中的闭包个很让人头疼的概念.总结一下 闭包是指有权访问一个函数作用域中的变量的函数.创建闭包最常见的方式,是在一个函数内部创建另一个函数,用return返回出去. 使用闭包可能造成 ...

  8. JavaScript ——闭包理解

    昨天晚上听别人谈起闭包这个东西,虽然对js有一点了解但却丝毫没有印象,今天也没什么事就顺便研究了一下满足好奇宝宝.整合于网上的理解,记录一下. 一.闭包的作用域 要理解闭包,首先必须理解Javascr ...

  9. 关于javascript闭包理解

    闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 一:关于变量的作用域 Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. ...

随机推荐

  1. override the hashcode and equals method in java

    http://howtodoinjava.com/2012/10/09/working-with-hashcode-and-equals-methods-in-java/

  2. 如何创建自定义ASP.NET MVC5脚手架模板?

    I'm using ASP.NET MVC5 and VS2013 I've tried to copy CodeTemplates folder from C:\Program Files (x86 ...

  3. 导航条css实现和table实现

    导航条式样 <style type="text/css"> ul,li{ margin:0; padding:0; list-style:none; } #navtop ...

  4. Redis中connect和pconnect的区别

    首先先介绍下connect和pconnect的区别.connect:脚本结束之后连接就释放了. pconnect:脚本结束之后连接不释放,连接保持在php-fpm进程中.所以使用pconnect代替c ...

  5. 多个dropdownlist只有第一个能选中,其他选不中之我见

    前段时间遇到这个问题,发现在页面中的源代码已经显示selected=“selected" 可是还是选中的第一项,试过很多办法,都不行,最后只好靠js来解决了,获取所有的dropdownlis ...

  6. 2016 ccpc 杭州赛区的总结

    毕竟是在杭电比的,和之前大连的icpc不同,杭电毕竟是隔壁学校,来回吃住全都是在自家寝室,方便! 不过说到方便也是有点不方便,室友都喜欢玩游戏,即使我昨晚9.30就睡觉了,仍然是凌晨一点才睡着,233 ...

  7. .Net日期处理之格式化

    一.默认格式 2015/9/3 9:04:31 二.格式2 2015年9月3日 9:28:51 三.格式3 2015年9月3日 9:31 四.格式4 2015/9/3 9:39:01 五.格式5 20 ...

  8. dos cmd重启2003命令shutdown -r -t 0

    用cmd命令来关闭或重启电脑. at 2:00 /every:Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday shutdown /r ...

  9. hash随笔

    hash属性是一个可读可写的字符串,是url的锚部分(从#开始).多用于单页面应用中,使其包含多个页面. 定位:通过id来定位 eg: <div id= "part1"> ...

  10. String s = new String("aa") 创建了几个对象?

    1 最近几个同学面试的时候出现了这样一个问题 刚听到这个题目的时候的确是不知所措: 经过网上的查找和自己的理解来解释一下这个题目的答案 答案是: 为什么呢??? 1 实现我们都知道创建实例有两种方法 ...