var myObject=(function(){ var _name="sven"; return{ getName:funtion(){ return _name; } } })(); console.log(myObject.getName());//输出:sven console.log(myObject._name);//这里为什么会输出undefined,是不能访问私有变量吗?
认证高级PHP讲师
myObject的值为return语句后的对象这个对象只有getName这个函数属性,而没有其它所以你能访问getName函数,而因为不存在_name属性,所以访问不到,返回结果为undefinedgetName能返回_name变量的值,是因为函数闭包的关系
myObject是return后面紧接着的
{ getName:funtion(){ return _name; } }
自然这里面就没有_name
闭包的用法http://www.cnblogs.com/sun-rain/p/4824160.html
把代码拆开给你看,上面等价于
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,然后看上一级作用域:
myObject
_name
getName
{}
{ reutrn _name}
{ var _name="sven"; var obj = { getName:function(){ return _name;} } return obj; }
有没有定义,所以访问的就是这个_name
myObject的值为return语句后的对象
这个对象只有getName这个函数属性,而没有其它
所以你能访问getName函数,而因为不存在_name属性,所以访问不到,返回结果为undefined
getName能返回_name变量的值,是因为函数闭包的关系
myObject是return后面紧接着的
自然这里面就没有_name
闭包的用法http://www.cnblogs.com/sun-rain/p/4824160.html
把代码拆开给你看,上面等价于
再等价一下====>>>>>
所以很明显为什么
myObject
没有_name
至于为什么
getName
可以访问_name
,是变量作用域的原因。简单来说就是(在es5中),一个函数定义的
{}
形成一级作用域。一句代码能访问的变量主要是看写的位置,而不是执行时候所在的位置,如果本级作用域不存在,则去上一级找,直到找到全局作用域,如果还不存在显然就是变量不存了了。对于
_name
, 所以先在{ reutrn _name}
中看有没有定义_name
,然后看上一级作用域:有没有定义,所以访问的就是这个
_name