js:深入闭包(作用域:上)

/**
 * 闭包的作用域
 */
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
执行步骤:

释放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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值