是否可以在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;
}
答案 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);