JavaScript模拟局部变量整理

在ES5中变量边界有两个,一是全局范围,二是函数范围,没有一般语言的作用域范围,比如
{
    var a = 1;
}
console.log(a); //1
上面会输出1,然而我们希望a仅仅局限于自己最近的括号内,而在括号外为未定义undefined,也即一般编程语言的局部变量。

本文是学习ES5时整理的模拟局部变量的奇巧淫技,现在看来相当于是回字的x种写法,已经无任何意义。因为在ES6中终于引入了let关键字来解决这个问题:
{
    let a = 1;
}
console.log(a); //undefine
非常完美,正常。然而作为一个回忆吧,还是把过去的奇巧淫技整理如下。

---------------奇巧淫技-----------------------------------
很惊人,原来这样简单都可以形成局部变量:

第一种
var person = new Object();
(function(){
var name = "inner_name";
person.getName = function(){
    return name;
}
})(); //这里执行后,生成了一个原本应该马上消失的作用域空间,但是因为被外界的person引用而不能释放
alert(person.getName());

第二种
var person = new Object();
(function(){
    var name = "inner_name";
    person.name = name; //这里不一定行,除非name是引用类型,否则这里是变量拷贝
})(); //这里执行后,函数内部变量被外部person引用 ???? alert(person.name);

以上是比较普遍的例子。从这个例子可见,这其实是一件很简单的事情,其本质是:
1,函数内部变量是私有的
2,执行函数,生成其内部变量,但是让外部对象引用这个内部变量
3,函数执行完毕,但是内部空间及内部变量被保存下来了,而没有被释放

仔细想,我们究竟想要什么样的内部私有变量?我们的期望包括:
其一:不可以用点号来索引该变量,包括读出或写进,比如o.name
其二:可以通过某些方法来操作该变量
我们正好就实现了这两点

继续尝试一下。

第三种:
var person = function(){
    var inner_name = "inner_name";
    this.inside_name = "inside_name";
};
alert(person.inner_name);//显示undefined
alert(person.inside_name);//显示undefined
本例person指向一个静止不动的函数对象,由于没有运行,其函数内部作用域的变量是不存在的

第三种之二
var person = function(){
    var inner_name = "inner_name";
    this.inside_name = "inside_name";
};
person.new_name = "new_name"
alert(person.new_name);
这里的new_name不是内部变量,而是person作为普通对象的属性

第四种:
function func_inner(){
    this.name = "inner_name";
};
var person = new func_inner();//当构造函数用,返回this
alert(person.name);//显示inner_name

第五种:
function func_inner(name){
    this.getName = function(){
         return name;
    }
};
var person = new func_inner("in_name");
alert(person.getName());//返回in_name

第六种:
var person = (function(){
    var o = new Object();
    o.inner_name = "inner_name";
    return o;
})();
alert(person.inner_name);//返回inner_name

总结:
    静态存在的函数对象,其内部变量并不存在
    函数对象执行了,其内部变量会生成,可以被return出来,也可以被引用出来,只要被指向,这些内部变量就不会丢失
    被当成构造函数被调用也是一样
    可以直接引用,也可以通过方法来引用,我们需要的是,在引用出来后,只能通过方法操作,而不能用点号操作,这样就形成了内部私有变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值