В качестве более элементарной ситуации было бы неплохо, если бы this
имел свойство, которое могло ссылаться на ссылающуюся переменную (heads
или tails
), но, к сожалению, оно ссылается только на создание экземпляра нового объекта coinSide
.
javascript: /* it would be nice but ... a solution NOT! */
function coinSide(){this.ref=this};
/* can .ref be set so as to identify it's referring variable? (heads or tails) */
heads = new coinSide();
tails = new coinSide();
toss = Math.random()<0.5 ? heads : tails;
alert(toss.ref);
alert(["FF's Gecko engine shows:\n\ntoss.toSource() is ", toss.toSource()])
, который всегда отображает
[object Object]
и движок Firefox Gecko показывает:
toss.toSource() is ,#1={ref:#1#}
Конечно, в этом примере для разрешения #1
и, следовательно, toss
достаточно просто протестировать toss==heads
и toss==tails
. Этот вопрос, который действительно задает, имеет ли javascript механизм call-by-name
, мотивирует рассмотрение аналога, существует ли механизм call-by-value
для определения фактического значения переменной? Пример демонстрирует, что «значения» как heads
, так и tails
идентичны, но alert(heads==tails)
равно false
.
Самостоятельная ссылка может быть приведена следующим образом:
(избегая поиска пространства объектов и возможных неоднозначностей, как отмечено в Как получить имя объекта класса в виде строки в Javascript? решение)
javascript:
function assign(n,v){ eval( n +"="+ v ); eval( n +".ref='"+ n +"'" ) }
function coinSide(){};
assign("heads", "new coinSide()");
assign("tails", "new coinSide()");
toss = Math.random()<0.5 ? heads : tails;
alert(toss.ref);
для отображения heads
или tails
.
Возможно, это анафема сущности языкового дизайна Javascript, как интерпретируемого функционального языка прототипирования, для таких возможностей, как примитивы.
Окончательное рассмотрение:
javascript:
item=new Object(); refName="item"; deferAgain="refName";
alert([deferAgain,eval(deferAgain),eval(eval(deferAgain))].join('\n'));
так, как оговорено ...
javascript:
function bindDIV(objName){
return eval( objName +'=new someObject("'+objName+'")' )
};
function someObject(objName){
this.div="\n<DIV onclick='window.opener."+ /* window.opener - hiccup!! */
objName+
".someFunction()'>clickable DIV</DIV>\n";
this.someFunction=function(){alert(['my variable object name is ',objName])}
};
with(window.open('','test').document){ /* see above hiccup */
write('<html>'+
bindDIV('DIVobj1').div+
bindDIV('DIV2').div+
(alias=bindDIV('multiply')).div+
'an aliased DIV clone'+multiply.div+
'</html>');
close();
};
void (0);
Есть ли лучший способ ...?
"лучше" как по проще? Проще программировать? Легче понять? Проще как в быстром исполнении? Или это как в " ... а теперь что-то совершенно другое "?