Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

偷天换日:不是变量的变量

  在JavaScript中,万物皆可是对象。而完整的对象本身是可以储存数据的,对象储存在变量中的只是一个指针而已,对象上的其它数据是以hash的方式储存在堆中的。这就意味着对象上随时可以插入和删除数据,不会因为对象的变量是在栈中就无法操作。
  在上一篇文章中我们使用了堆变量来解决问题,但是那个方法有点牵强了。其实如果找到一个对象,把它的键当做临时变量来使用也可以解决这个问题,甚至能更好的解决!也许你会觉得奇怪,连变量都没有,哪儿来的对象?哪儿来的键?其实,在函数作用域中,有两个对象是不会污染到子作用域的,那就是this和arguments。所有的函数作用域中,这两个东西必然存在,即使父作用域中存在,也会被子作用域中默认存在的覆盖掉,所以他们不会影响到子作用域。因此我们可以大胆地利用这两个对象的键来替代局部变量。
  对于上一篇文章中的问题我们可以这样解决。 new function(){
  this.o=function(){
    return {a:"1",b:"2",c:"3"};
  }();
  for(this.i in this.o)
    eval("var "+this.i+"=this.o[this.i]");
  (function(){
    alert(a+b+c); //123
  })();
};
  这种解决方式比上一篇的爽多了吧?这里只是使用了this,如果需求中this已经被占用了,我们也可以使用arguments来实现。arguments是一个拟数组,所以永远可以找到一块可以利用的区域,只是这个变量名比较长,用起来比较麻烦而已。
网名:
54.144.24.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^