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 bar, age.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. find the majority element

    Runtime: O(n) — Moore voting algorithm: We maintain a current candidate and a counter initialized to ...

  2. 抛弃jQuery,拥抱原生JavaScript

    前端发展很快,现代浏览器原生 API 已经足够好用.我们并不需要为了操作 DOM.Event 等再学习一下 jQuery 的 API.同时由于 React.Angular.Vue 等框架的流行,直接操 ...

  3. Guava API

    1.字符串的处理 字符串的连接&拆分&匹配及常用操作 Joiner&Splitter @Test public void testJoiner() { String[] str ...

  4. CAPSPageMenu分页交互

    最近在开发过程中,我的前任在处理类似于新闻多板块的界面,在一个视图控制器里加载多个UITableView以显示不同类型的信息,并可通过头部按钮和左右滑动来切换不同的tableView这样的界面中,采取 ...

  5. OpenLayers 3 的地图基本操作

    <body> <div id="map"> <div id="menu"> <button id="zoom ...

  6. iOS开发frame, contentSize, contentOffset, contentInset 区别联系浅析

    1. 概述 iOS开发中,必然会涉及到布局相关问题,frame,bounds,contenSize,contentOffset,contentInset这几个布局相关概念让许多初学者感到困惑.虽然初步 ...

  7. Git学习 -- 冲突解决

    当连个分支对统一文件提交了不同修改时,可能会出现冲突,例如: $ git merge feature1 Auto-merging readme.txt CONFLICT (content): Merg ...

  8. GB2312、Unicode编码等

    抛出问题: 我在CPP文件中,打算输出一行阿拉伯字符:

  9. 通过onActivityResult()先跳转到联系人界面,然后把传回来的手机号显示到应用的EditText上

    <pre name="code" class="plain"><pre name="code" class="p ...

  10. Java与C#的比较学习

    http://www.cnblogs.com/javathread/archive/2012/08/11/2634893.html 我在大学学的是C语言,自学和选修的是C++,刚毕业也搞过几天Jsp, ...