首页 > 关于函数访问变量问题

关于函数访问变量问题

  var myObject=(function(){
      var _name="sven";
      return{
        getName:funtion(){
           return _name;
        }
      }
  })();
  console.log(myObject.getName());//输出:sven
  console.log(myObject._name);//这里为什么会输出undefined,是不能访问私有变量吗?

myObject是return后面紧接着的

{
  getName:funtion(){
    return _name;
  }
}

自然这里面就没有_name


把代码拆开给你看,上面等价于

  var myObject=(function(){
      var _name="sven";
      var obj = {
          getName:function(){ return _name;}
      }
      return obj;
  })();
  console.log(myObject.getName());
  console.log(myObject._name);

再等价一下====>>>>>

  function func(){
      var _name="sven";
      var obj = {
          getName:function(){ return _name;}
      }
      return obj;
  };
   var myObject = funct();
  console.log(myObject.getName());
  console.log(myObject._name);

所以很明显为什么 myObject没有_name
至于为什么getName可以访问_name,是变量作用域的原因。
简单来说就是(在es5中),一个函数定义的{}形成一级作用域。一句代码能访问的变量主要是看写的位置,而不是执行时候所在的位置,如果本级作用域不存在,则去上一级找,直到找到全局作用域,如果还不存在显然就是变量不存了了。
对于_name, 所以先在{ reutrn _name}中看有没有定义_name,然后看上一级作用域:

{
      var _name="sven";
      var obj = {
          getName:function(){ return _name;}
      }
      return obj;
}

有没有定义,所以访问的就是这个_name


闭包的用法http://www.cnblogs.com/sun-rain/p/4824160.html


myObject的值为return语句后的对象
这个对象只有getName这个函数属性,而没有其它
所以你能访问getName函数,而因为不存在_name属性,所以访问不到,返回结果为undefined
getName能返回_name变量的值,是因为函数闭包的关系

【热门文章】
【热门文章】