我已尽力解决这个问题,现在我陷入困境,为什么第四个警报会返回未定义?
function buttonClick()
{
var myTest = function()
{
var _setDirectlyInside = "So far so good...";
var _setInFunctionCalledInside;
var _setInFunctionCalledFromOutside;
(function(){
_setInFunctionCalledInside = "This would indicate scope isn't the problem?";
})();
return {
basic : "Easy stuff",
setDirectlyInside : _setDirectlyInside,
setInFunctionCalledInside : _setInFunctionCalledInside,
functionCallFromOutside : function(){
_setInFunctionCalledFromOutside = "Why does this come back as undefined?";
},
setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside
}
};
var test = myTest();
alert(test.basic); // Returns "Easy stuff"
alert(test.setDirectlyInside); // Returns "So far so good..."
alert(test.setInFunctionCalledInside); // Returns "This would indicate scope isn't the problem?"
test.functionCallFromOutside();
alert(test.setInFunctionCalledFromOutside); // Broken, returns undefined
}
分辨率:
setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside, // Won't work
setInFunctionCalledFromOutsideGetter : function(){
return _setInFunctionCalledFromOutside; // Will work
}
...
alert(test.setInFunctionCalledFromOutside); // Broken, returns undefined
alert(test.setInFunctionCalledFromOutsideGetter()); // Now works
答案 0 :(得分:2)
此:
return {
basic : "Easy stuff",
setDirectlyInside : _setDirectlyInside,
setInFunctionCalledInside : _setInFunctionCalledInside,
functionCallFromOutside : function(){
_setInFunctionCalledFromOutside = "Why does this come back as undefined?";
},
setInFunctionCalledFromOutside : _setInFunctionCalledFromOutside
}
...不会导致setInFunctionCalledFromOutside
始终返回_setInFunctionCalledFromOutside
的相同值。相反,_setInFunctionCalledFromOutside
将在return
语句执行时进行评估,其值将放在setInFunctionCalledFromOutside
中。因此,functionCallFromOutside()
对setInFunctionCalledFromOutside
无效。
答案 1 :(得分:1)
@nnnnnn said it best,但他删除了答案。 setInFunctionCalledFromOutside
指针指向_setInFunctionCalledFromOutside
。在创建返回的对象时,setInFunctionCalledFromOutside
被赋予_setInFunctionCalledFromOutside
所具有的值。由于尚未分配任何值,因此值为undefined
。改变一个的值,不会改变另一个的值。
一个更简单的例子说明了相同的原则:
var i = 0;
var n = i;
i++;
alert(i); // 1
alert(n); // still 0
答案 2 :(得分:1)
要添加到其他人 - 供参考,JS按值传递字符串和数字。 它通过引用传递/分配对象,数组和函数。
这不是你要击中的障碍(因为你的内部变量在你将其分配给外部变量时是undefined
),但即使你确实修复了第一部分: / p>
var internal = "string";
return {
external : internal,
setInternal : function (val) { internal = val; }
};
仍然无法解决问题,因为obj.external
将始终是“字符串”
为什么呢?
因为您在分配时将external
设置为与internal
相同的值,并且不等于reference
的{{1}}(即:指向它的指针) )。
如果您正在寻找指针,请将internal
作为对象:
internal
为什么现在有效?
因为internal是一个对象,当你赋值var internal = { string : "my string" };
return {
external : internal,
setInternal : function (val) { internal.string = val; }
};
obj.external.string; // "my string"
obj.setInternal("Bob was here");
obj.external.string; // "bob was here"
时,你给它一个指向external
也有一个指针的对象的指针。
当您更改internal
的属性时,例如internal
,因为internal.string
指向同一个对象,external
具有相同的值。
如果您将external.string
设置为完全不同的内容,那么您将internal
指向其他内容(例如internal
),因此internal = null;
将不再更改,修改external
,因为internal
不再指向以前的对象。