javascript变量引用/别名

时间:2009-11-06 11:22:46

标签: javascript

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

我的意思是C-like:

function foo() {
  var x = 1;
  var y = &x;
  y++;
  alert(x); // prints 2 
}

= EDIT =

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

function foo() {
  arguments.callee.myStaticVar = arguments.callee.myStaticVar || 0;
  arguments.callee.myStaticVar++;
  return arguments.callee.myStaticVar;
}

6 个答案:

答案 0 :(得分:171)

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

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

答案 1 :(得分: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 

答案 2 :(得分:8)

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

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

function foo() {
  var self = arguments.callee;
  self.myStaticVar = self.myStaticVar || 0;
  self.myStaticVar++;
  return self.myStaticVar;
}

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

答案 3 :(得分:1)

编辑我之前的回答:如果你想计算一个函数的调用,你可能想尝试:

var countMe = ( function() {
  var c = 0;

  return function() {
    c++;
    return c;
  }
})();

alert(countMe()); // Alerts "1"
alert(countMe()); // Alerts "2"

这里,c作为计数器,你不必使用arguments.callee。

答案 4 :(得分:1)

扩展user187291's post,您还可以使用getter / setter来解决必须使用的功能。

var x = 1;
var ref = {
    get x()  { return x; },
    set x(v) { x = v; }
};
(ref.x)++;
console.log(x); // prints '2'
x--;
console.log(ref.x); // prints '1'

答案 5 :(得分:0)

在2019年,我需要编写缩小的jquery插件,所以我也需要这个别名,因此从其他来源测试了这些示例和其他示例,我发现了一种在整个对象的内存中没有复制的方法,但仅创建了一个引用。 我已经使用Firefox进行了测试,并且之前在Firefox上观看了任务管理器的选项卡内存。 代码是:

var {p: d} ={p: document};
console.log(d.body);