是否有可能在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)
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)
是否可以别名取决于数据类型.对象,数组和函数将通过引用处理,并且可以进行别名处理.其他类型基本上是原子的,变量存储值而不是对值的引用.
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于为变量分配"新"整数.