var myObject=(function(){
var _name="sven";
return{
getName:funtion(){
return _name;
}
}
})();
console.log(myObject.getName());//输出:sven
console.log(myObject._name);//这里为什么会输出undefined,是不能访问私有变量吗?
大家讲道理2017-04-10 15:54:04
myObject的值为return语句后的对象
这个对象只有getName这个函数属性,而没有其它
所以你能访问getName函数,而因为不存在_name属性,所以访问不到,返回结果为undefined
getName能返回_name变量的值,是因为函数闭包的关系
阿神2017-04-10 15:54:04
myObject是return后面紧接着的
{
getName:funtion(){
return _name;
}
}
自然这里面就没有_name
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