function fn1(){

  //创建一个数组

  var fns = new Array();

  //i这个变量是保存在fn1这个作用域中

  for(var i=0;i<10;i++){

    //数组中的值是一组函数

    fns[i] = function(){

      return i; 

    } 

  }

  return fns;

}

var fs = fn1();

for(var i=0;i<fs.length;i++){

  //此时通过闭包来调用全部的函数,当要输出i的时候会在它所在的定义域(fn1)中找到它,

  //此时它已变为10。所以连续输出了10个10

  console.log(fs[i]()); 

} //输出:10

---------------------------解决方式------------------------------

function fn1(){

  //创建了一个数组

  var fns = new Array();

  //i这个变量是保存在fn1这个作用域中

  for(var i=0;i<10;i++){

    //num这个变量保存在tf作用域。每个闭包的num都是不一样的

    //所以此时所消耗的内存较大。

    var tf = function(num){

      fns[num] = function(){

        return num; 

      }

    }

    tf(i);

  }

  return fns;

}

var fs = fn1();

for(var i=0;i<fs.length;i++){

  //

  console.log(fs[i]()); 

} //输出:0 ~ 9

---------------------------块作用域------------------------------

for(var i=0;i<10;i++){

   

}

//在js中没有块作用域。无论是使用循环还是推断之后,这个变量一直存在

/**

 * 所以当在全局使用某个变量进行循环或推断之后,这个变量可能会影响到函数的变量,所以

 * 所以在特殊情况下不要使用全局变量。并且全局变量在作用域链的最上层。訪问是最慢的。

 */

console.log(i);

function fn1(){

  console.log(i); 

}

fn1();

/**

 * 在一个团队进行开发中,可能会涉及到定义同名的全局变量,所以在开发中要养成一个好习惯:

 * 将全局变量代码放到一个匿名函数。而且立即调用匿名函数,这样也能够运行全局变量的代码。

 * 可是这些变量被控制在开发者想要控制的作用域中。

*/

解决的方法:将块作用域定义在一个匿名函数中。

(function(){

  for(var i=0;i<10;i++){

   

  }  

})(); //在function的{}后不能直接调用。一定要加把匿名函数放在()内再运行。

---------------------------私有变量------------------------------

function Person(name){

  /**

   *此时没有办法直接訪问name这个属性,由于没有this.name,

   *要訪问name仅仅能通过this.getName获取。通过this.setName设置

   */

  this.setName = function(value){

    name = value;

  } 

  this.getName = function(){

    return name; 

  }

}

var p = new Person("zhang"); //zhang

console.log(p.getName());

p.setName("li");

console.log(p.getName()); //li

/**可是使用这样的方式创建私有变量带来的问题是每一个对象要存储大量函数。

 * 解决办法是通过静态私有变量来解决。

 */

---------------------------解决方式------------------------------

var Person;

(function(){

  //name在函数结束之后就消失,在外面无法使用

  var name = "";

  Person = function(value){

    name = value;

  }

  Person.prototype.setName = function(value){

    name = value;

  }

  Person.prototype.getName = function(){

    return name;

  }

})();

var p1 = new Person("aaa"); //aaa

console.log(p1.getName());

p1.setName("bbb"); //bbb

console.log(p1.getName());

原创文章如转载。请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/25459099

版权声明:本文博客原创文章。博客,未经同意,不得转载。

js:进一步关闭(范围:下一个)的更多相关文章

  1. 一个js程序:离下一个圣诞节还有多少天?

    话不多说上代码: //离下一个圣诞节还有多少天 var christ=new Date(); christ.setMonth(11); christ.setDate(25); var year=now ...

  2. JS window对象 返回下一个浏览的页面 forward()方法,加载 history 列表中的下一个 URL。

    返回下一个浏览的页面 forward()方法,加载 history 列表中的下一个 URL. 如果倒退之后,再想回到倒退之前浏览的页面,则可以使用forward()方法,代码如下: window.hi ...

  3. js获取上一个月、下一个月格式为yyyy-mm-dd的日期

    /** * 获取上一个月 * * @date 格式为yyyy-mm-dd的日期,如:2014-01-25 */ function getPreMonth(date) { var arr = date. ...

  4. js jquery获取当前元素的兄弟级 上一个 下一个元素

    原博地址:http://www.jb51.net/article/71782.htm var chils= s.childNodes;  //得到s的全部子节点 var par=s.parentNod ...

  5. JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法

    $(function(){ //遍历获取的input元素对象数组,绑定click事件 var len = $("input[type='file']").length; ; i & ...

  6. js jquery获取当前元素的兄弟级 上一个 下一个元素 jquery如何获取第一个或最后一个子元素

    var chils= s.childNodes;  //得到s的全部子节点 var par=s.parentNode;   //得到s的父节点 var ns=s.nextSbiling;   //获得 ...

  7. JS 如何获取当前上一个月、下一个月和月份所含天数

    在数据报表查询中,经常需要设置查询的日期区间,如查询2018-02-01至2018-02-28的整月数据,这时需要提供快捷整月查询按钮: 如: 一般日期年月日之间由"-"或者&qu ...

  8. 用CSS画小猪佩奇,你就是下一个社会人! js将“I am a coder”反转成 “coder a am I”,不许用split,join,subString,reverse;求解方法三

    用CSS画小猪佩奇,你就是下一个社会人!   欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 作者:江志耿 | 腾讯TEG网络工程师 我是佩奇,哼,这是我的弟弟乔治,呱呱,这是我的妈妈,嚯 ...

  9. js,onblur后下一个控件获取焦点判断、html当前活跃控件、jquery版本查看、jquery查看浏览器版本、setTimeout&setInterval

    需求: input控件在失去焦点后直接做验证,验证通不过的话,显示相应错误.但是如果失去焦点后点击的下个控件是比较特殊的控件(比如,退出系统),那么不执行验证操作,直接退出系统(防止在系统退出前,还显 ...

随机推荐

  1. MFC 在对话框显示图片的多种方法(四种方法)

    我们先从简单的开始吧.先分一个类: (一) 非动态显示图片(即图片先通过资源管理器载入,有一个固定ID) (二) 动态载入图片(即只需要在程序中指定图片的路径即可载入) 为方便说明,我们已经建好一个基 ...

  2. 不包含SDK头文件, 补全API定义

    /// @file main.cpp /// @brief 不包含SDK头文件, 补全API定义 #ifdef __cplusplus extern "C" { #endif /* ...

  3. DataTable的一些使用技巧

    在做机房的时候经常用到DataTable,发现如果DataTable使用的好的话,不仅能使程序简洁实用,而且能够提高性能,达到事半功倍的效果.现在对我知道的一些技巧做个总结,虽然都是一些简单的,但是发 ...

  4. 【Cocos2d-X开发学习笔记】第28期:游戏中音乐和音效的使用

    本系列学习教程使用的是cocos2d-x-2.1.4(最新版为3.0alpha0-pre) ,PC开发环境Windows7,C++开发环境VS2010 UI在游戏中占有很重要的地位,但吸引玩家的除了这 ...

  5. Java描述语言、国家和地理的类——Locale

    Locale类代表一个特定的地理.语言和国家环境.一个Locale的实例对象本身不会验证它代表的语言和国家地区信息是否正确,只是向一些对国家和语言.地理等比较敏感的类提供国家地区语言信息,这些类有Da ...

  6. Codeforces Round #216 (Div. 2) D. Valera and Fools

    题目链接:http://codeforces.com/contest/369/problem/D 注意题意:所有fools都向编号最小的fool开枪:但每个fool都不会笨到想自己开枪,所以编号最小的 ...

  7. Boost下载安装编译配置使用指南(含Windows和Linux

    理论上,本文适用于boost的各个版本,尤其是最新版本1.45.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,gcc,C++ Builder等.先 ...

  8. javascript 自己主动绑定JS callback 的方法函数

    自己写的一个javascript 智能绑定callback 而且调用运行的函数.主要用于异步请求的 ajax中: <!DOCTYPE html> <html> <head ...

  9. HashSet的排序

    import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util ...

  10. qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

    参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVa ...