javascript变量引用/别名

gpi*_*ino 89 javascript

是否有可能在javascript中为某个本地var分配别名/引用?

我的意思是C-like:

function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}
Run Code Online (Sandbox Code Playgroud)

=编辑=

是否可以在此代码中为arguments.callee设置别名?:

function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rov 173

在JavaScript中,原始类型(如整数和字符串)按值传递,而对象通过引用传递.所以为了实现这个目标,你需要使用一个对象:

// declare an object with property x
var obj = { x: 1 };
var aliasToObj = obj;
aliasToObj.x ++;
alert( obj.x ); // displays 2
Run Code Online (Sandbox Code Playgroud)

  • @Darin:这有点过于简单了.它是不可变的vs可变类型,而不是原始类型vs对象.在JavaScript中,一切都是某种形式的对象. (9认同)
  • 在JS中,引用按值传递."传递参考"和"传递参考值"之间存在差异.在Javascript中,通过引用传递参数不会被支持. (7认同)

use*_*291 15

在某种程度上这是可能的,您可以使用闭包创建变量的别名:

Function.prototype.toString = function() {
    return this();
}

var x = 1;
var y = function() { return x }
x++;
alert(y); // prints 2, no need for () because of toString redefinition 
Run Code Online (Sandbox Code Playgroud)

  • toString重新定义是有原因的,所以`alert(y)`实际上是正确的.虽然重新定义函数原型方法是非常糟糕的风格.但是,嘿,它有效! (3认同)

Jus*_*ove 8

是否可以别名取决于数据类型.对象,数组和函数将通过引用处理,并且可以进行别名处理.其他类型基本上是原子的,变量存储值而不是对值的引用.

arguments.callee是一个函数,因此您可以对它进行引用并修改该共享对象.

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}
Run Code Online (Sandbox Code Playgroud)

请注意,如果在上面的代码你说self = function() {return 42;};self会再指不同的对象arguments.callee,这仍然是一个参考foo.当您有一个复合对象时,赋值运算符将替换该引用,它不会更改引用的对象.对于原子值,类似的情况y++等同y = y + 1于为变量分配"新"整数.