javascript 变量引用/别名

IT技术 javascript
2021-01-21 05:55:49

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

我的意思是类似 C 的东西:

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

= 编辑 =

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

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

在 JavaScript 中,整数和字符串等原始类型是按值传递的,而对象是按引用传递的。因此,为了实现这一点,您需要使用一个对象:

// declare an object with property x
var obj = { x: 1 };
var aliasToObj = obj;
aliasToObj.x ++;
alert( obj.x ); // displays 2
这很快 =) 我想在我的函数中为 arguments.callee 创建一个别名(只是为了避免每次都输入 arguments.callee)。这种方法可以吗?如果我理解,我可以为“参数”设置别名,但无论如何我仍然必须写“被调用者”,不是吗?
2021-03-21 05:55:49
@Darin:这有点过于简单化了。它是不可变类型与可变类型,而不是原始类型与对象。在 JavaScript 中,一切都是某种形式的对象。
2021-03-24 05:55:49
在 JS 中,引用是按值传递的。“按引用传递”和“按值传递引用”是有区别的。在 Javascript 中不支持通过引用传递参数。
2021-04-07 05:55:49

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

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 
重新定义 toString 是有原因的,所以alert(y)实际上是正确的。虽然重新定义函数原型方法是非常糟糕的风格。但是,嘿,它有效!
2021-04-01 05:55:49
我相信 "alert(y); // 打印 2" 应该是: "alert(y()); // 打印 2" 您必须实际调用该函数才能获得结果。太糟糕了,因为建议的语法在某些情况下会有所帮助。
2021-04-05 05:55:49

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

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,即为变量分配一个“新”整数。

更不用说arguments.callee已经有了别名,也就是函数名。在这个例子中,你可以只使用foo.myStaticVar(也许 2009 年的情况不是这样?)
2021-04-13 05:55:49

扩展user187291 的帖子,您还可以使用 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'

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

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

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

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

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

或者你可以使用静态变量 countMe = function f(){ return ++f.c || (f.c = 1); }
2021-03-21 05:55:49