/**

 * 范围封锁

 */

fn1(); //fn1 您可以运行,没有报错,对于由function func_name()这样的写法来定义的函数,永远都会被最先初始化。

function fn1(){

  console.log("fn1");

}

fn2(); //报错:fn2 is not a function

/**

 *使用例如以下方式定义函数,不会被先运行,假设在定义之前调用。报错。

 *这样的函数的定义方式是先在内存中创建一块区域,之后通过一个fn2的变量指向这块区域。

 *这块区域的函数開始时是没有名称的。这样的函数名称叫做匿名函数。

*/

var fn2 = function(){

  console.log("fn2"); 

}

----------------------------------函数作用域--------------------------------------

/**

 * 在js中当进行函数调用时,会为每个函数添加一个属性scope,通过这个属性来指向一块内存。

 * 这块内存中包括有全部的上下文使用的变量,当在某个函数中调用了新函数之后。新函数依旧会有

 * 一个作用域来指向原有的函数的scope和自己新添加的scope,这样就形成了一个链式结构,

 * 这就是js中的作用域链。

 */

var color = "red";

var showColor = function(){

  console.log(this.color); 

}

function changeColor(){

  var anotherColor = "blue";

  function swapColor(){

    var tempColor = anotherColor;

    anotherColor = color;

    color = tempColor;

  }   

  swapColor();

}

changeColor();

showColor(); //blue

运行步骤:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTWFnbmV0bzc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center">

释放swapColor

释放changeColor

运行showColor

--------------------------------------------------------------------------

var name = "one";

var object = {

  name:"two",

  getName:function(){

     //var name = "three";

    return function(){

      return this.name;

      //return name;

    };

  }

};

console.log(object.getName()()); //one

想想问什么?若是在getName函数里再加个 var name = "three" 呢?若把匿名函数里的 return this.name; 改为 return name; 呢?

返回值是什么,为什么?

假设你能理解上面代码的执行结果,应该就算理解闭包的执行机制了。

/**

 * 使用闭包尽管能够演唱作用域,可是也会占用过多的内存,一般非特殊情况下不要使用闭包。

 *

 */

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

js:深闭包(范围:上)的更多相关文章

  1. 关于js中闭包的理解

    1.以前很不理解js中闭包的概念及使用,下面来看一下 function foo() { var a = 123; var b = 456; return function () { return a; ...

  2. js的闭包

    一,关于js闭包的只是感觉很高大上似乎,对于学弱来说任何问题都是这样的,值得去钻研和提高. 资料上理解的都是关于js的闭包其实就是js的变量的作用域的灵活使用. 函数内部定义变量的时候,一定要用 va ...

  3. 彻底搞清js中闭包(Closure)的概念

    js中闭包这个概念对于初学js的同学来说, 会比较陌生, 有些难以理解, 理解起来非常模糊. 今天就和大家一起来探讨一下这个玩意. 相信大家在看完后, 心中的迷惑会迎然而解. 闭包概念: 闭包就是有权 ...

  4. 理解运用JS的闭包、高阶函数、柯里化

    JS的闭包,是一个谈论得比较多的话题了,不过细细想来,有些人还是理不清闭包的概念定义以及相关的特性. 这里就整理一些,做个总结. 一.闭包 1. 闭包的概念 闭包与执行上下文.环境.作用域息息相关 执 ...

  5. js 深冻结 与 浅冻结 Object.freeze

    1.深冻结 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <t ...

  6. [ JS 进阶 ] 闭包,作用域链,垃圾回收,内存泄露

    原网址:https://segmentfault.com/a/1190000002778015 1. 什么是闭包? 来看一些关于闭包的定义: 闭包是指有权访问另一个函数作用域中变量的函数 --< ...

  7. JS的闭包、高阶函数、柯里化

    本文原链接:https://cloud.tencent.com/developer/article/1326958 https://cloud.tencent.com/developer/articl ...

  8. JS的闭包问题

    1.什么是“闭包” 是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 2.闭包的应用场景 (1)保护变量的安全实现JS私有属性和私有方法 (2)在 ...

  9. JS的this总结(上)-call()和apply()

    JS的this总结(上)-call()和apply() ​ 相信很多人在学习JavaScript的过程中,都会了解到this,而大部分人都会特意去网络上搜一下相关资料,大部分的文章都有这么一句话: t ...

随机推荐

  1. HDU1237 简单的计算器 【堆】+【逆波兰式】

    简单的计算器 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  2. [Erlang危机](5.1.0)VM检测概述

    原创文章.转载请注明出处:server非业余研究http://blog.csdn.net/erlib 作者Sunface 把执行指标储存在VM的内存中.能够指定是全局的还是app所特有的. • vms ...

  3. Cocos2d-x示例:单点触摸事件

    为了让大家掌握Cocos2d-x中的事件机制,以下我们以触摸事件为例.使用事件触发器实现单点触摸事件.该实比如图8-3所看到的,场景中有三个方块精灵,显示顺序如图8-3所看到的,拖拽它们能够移动它们. ...

  4. oracle 12c 三学习 pdb 可插拔测试

    DECLARE l_result BOOLEAN; BEGIN l_result := DBMS_PDB.check_plug_compatibility( pdb_descr_file => ...

  5. 【新秀疯狂UML系列】——面向对象的技术

    从软质工作开始,我们来到与面向对象的接触,接下来的学习材料似乎已经提到了面向对象,在与她的朋友去一个.所以,我们必须知道她多一点点. 一.何为面向对象? 面向对象(Object Oriented).是 ...

  6. 解决新版Emacs的警告:Warning (initialization): Your load-path...

    升级到新版Emacs后出现警告 作为做好用的代码编辑器之一,Emacs绝对在极客世界实用率很高.当然VIM也有很多支持者.但小编是从VIM转到Emacs的,个人觉得Emacs更好用. 小编最近升级了F ...

  7. vmWare虚拟机下ubuntu配置代理上网

    最终用上了linux,windows下用vmWare安装虚拟机,挂ubuntu 14.04,,认为非常不习惯,非常难侍候. 而且遇到的客观困难还不少,这两天着实费了不少功夫.主要是上班这里上网要配置代 ...

  8. hadoop得知;block数据块;mapreduce实现样例;UnsupportedClassVersionError变态;该项目的源代码相关联

    对于开源的东西.特别是刚出来不久.我认为最好的学习方法是能够看到源代码,doc,样品测试 为了方便查看源代码,导入与项目相关的源代码 watermark/2/text/aHR0cDovL2Jsb2cu ...

  9. ZOJ1463:Brackets Sequence(间隙DP)

    Let us define a regular brackets sequence in the following way: 1. Empty sequence is a regular seque ...

  10. Linux核心regulator建筑和准备

    电源引入的物种 (百度百科)LDO这是low dropout regulator,这意味着低压差线性稳压器.它相比于传统的线性调节器.传统的线性稳压器.例如78xx系列芯片需要输入电压比输出电压高2v ...