javascript - argument - js不定参数



javascript变量引用/别名 (4)

是否有可能在JavaScript中分配一个别名/引用本地变种?

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

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;
}

在JavaScript中,基本类型(如整数和字符串)按值传递,而对象按引用传递。 所以为了达到这个目标,你需要使用一个对象:

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

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

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 

扩展user187291的帖子 ,你也可以使用getters / setters来避免使用函数。

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'

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

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 ,它将一个“新”整数赋予变量。





javascript