/**

 * 范围封锁

 */

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

运行步骤:

js:深闭包(范围:上)-LMLPHPjs:深闭包(范围:上)-LMLPHP

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

04-23 09:20