javascriptvariables引用/别名
是否有可能在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中,基本types(如整数和string)按值传递,而对象按引用传递。 所以为了达到这个目的,你需要使用一个对象:
// declare an object with property x var obj = { x: 1 }; var aliasToObj = obj; aliasToObj.x ++; alert( obj.x ); // displays 2
在某种程度上这是可能的,你可以使用闭包创build一个variables的别名:
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
是否可以别名取决于数据types。 对象,数组和函数将通过引用进行处理,而且可以使用别名。 其他types基本上是primefaces的,variables存储的值,而不是一个值的引用。
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
的引用。 当你有一个复合对象时,赋值操作符replace了引用,它不会改变被引用的对象。 对于primefaces值,像y++
这样的情况相当于y = y + 1
,它将一个“新”整数赋值给variables。
编辑到我以前的答案:如果你想计算一个函数的调用,你可能想尝试:
var countMe = ( function() { var c = 0; return function() { c++; return c; } })(); alert(countMe()); // Alerts "1" alert(countMe()); // Alerts "2"
这里,c用作计数器,并且不必使用arguments.callee。
在user187291的文章上展开,你也可以使用getters / setter来绕过不得不使用的function。
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'
我今天search了我的项目,发现这看起来是最好的办法: http : //sirdarckcat.blogspot.com/2007/07/passing-reference-to-javascript.html