search

Home  >  Q&A  >  body text

javascript - 关于函数访问变量问题

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

reply all(4)I'll reply

  • 大家讲道理

    大家讲道理2017-04-10 15:54:04

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

    reply
    0
  • 阿神

    阿神2017-04-10 15:54:04

    myObject是return后面紧接着的

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

    自然这里面就没有_name

    reply
    0
  • PHP中文网

    PHP中文网2017-04-10 15:54:04

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

    reply
    0
  • PHPz

    PHPz2017-04-10 15:54:04

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

      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

    reply
    0
  • Cancelreply