在JavaScript中设置对象值
我已经尽了最大努力来解决这个问题,现在我被卡住了,为什么第四个警报返回未定义在JavaScript中设置对象值,javascript,Javascript,我已经尽了最大努力来解决这个问题,现在我被卡住了,为什么第四个警报返回未定义 function buttonClick() { var myTest = function() { var _setDirectlyInside = "So far so good..."; var _setInFunctionCalledInside; var _setInFunctionCalledFromOutside; (function(){ _setI
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
这:
…不会导致SetInFunctionCalledFromOut始终返回与_SetInFunctionCalledFromOut相同的值。相反,将在执行return语句时对_setinFunctionCalledFromOut求值,并将其值置于setinFunctionCalledFromOut中。因此,functionCallFromOutside对setInFunctionCalledFromOutside没有影响。这:
…不会导致SetInFunctionCalledFromOut始终返回与_SetInFunctionCalledFromOut相同的值。相反,将在执行return语句时对_setinFunctionCalledFromOut求值,并将其值置于setinFunctionCalledFromOut中。因此,functionCallFromOutside对setInFunctionCalledFromOutside没有影响。,但他删除了他的答案。SetInFunctionCalledFromouter不是指向_SetInFunctionCalledFromouter的指针。在创建返回的对象时,SetInFunctionCalledFromOut被分配了_SetInFunctionCalledFromOut拥有的值。由于尚未分配任何值,因此该值未定义。更改其中一个的值不会更改另一个的值
一个简单的例子说明了相同的原理:
var i = 0;
var n = i;
i++;
alert(i); // 1
alert(n); // still 0
,但他删除了他的答案。SetInFunctionCalledFromouter不是指向_SetInFunctionCalledFromouter的指针。在创建返回的对象时,SetInFunctionCalledFromOut被分配了_SetInFunctionCalledFromOut拥有的值。由于尚未分配任何值,因此该值未定义。更改其中一个的值不会更改另一个的值
一个简单的例子说明了相同的原理:
var i = 0;
var n = i;
i++;
alert(i); // 1
alert(n); // still 0
为了添加到其他文件中-供参考,JS通过值传递字符串和数字。 它通过引用传递/分配对象、数组和函数 这并不是您遇到的障碍,因为在您将内部变量指定给外部变量时,内部变量尚未定义,但即使您已修复了第一部分:
var internal = "string";
return {
external : internal,
setInternal : function (val) { internal = val; }
};
这仍然不能解决问题,因为obj.external将始终是字符串。
为什么?
因为您在赋值时将external设置为与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"
为什么它现在起作用了?
因为internal是一个对象,当您指定external的值时,您会给它一个指向该对象的指针,而internal也有一个指向该对象的指针。
当您更改internal的属性(如internal.string)时,因为external指向同一对象,external.string具有相同的值
如果您将internal设置为完全不同的值,那么您将internal指向其他值,如internal=null;,因此,当您修改internal时,external将不再更改,因为internal不再指向它以前所指向的对象。要添加到其他对象,JS将按值传递字符串和数字以供参考。 它通过引用传递/分配对象、数组和函数 这并不是您遇到的障碍,因为在您将内部变量指定给外部变量时,内部变量尚未定义,但即使您已修复了第一部分:
var internal = "string";
return {
external : internal,
setInternal : function (val) { internal = val; }
};
这仍然不能解决问题,因为obj.external将始终是字符串。
为什么?
因为您在赋值时将external设置为与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"
为什么它现在起作用了?
因为internal是一个对象,当您指定external的值时,您会给它一个指向该对象的指针,而internal也有一个指向该对象的指针。
当您更改internal的属性(如internal.string)时,因为external指向同一对象,external.string具有相同的值
如果您将internal设置为完全不同的值,那么您将internal指向其他值,如internal=null;,因此,当您修改internal时,external将不再更改,因为internal不再指向它以前的对象。我认为functionCallFromOutside只包含函数定义,稍后将由test执行。functionCallFromOutside?我的想法哪里错了?那不是你的想法错了。当您调用test.functionCallFromOutside时,它正在执行。问题在于,当函数设置_setInFunctionCalledFromOutside=时,为什么会返回为未定义?它还将更新setInFunctionCalledFromOutside属性。啊,我知道哪里出了问题,我不希望它也会这样更新值,但我感觉setInFunctionCalledFromOutside更像是一个C getter属性
Y将其更改为一个函数,然后像getter一样调用该函数,可以得到所需的结果。谢谢你的帮助!我认为functionCallFromOutside只包含函数定义,稍后将由test执行。functionCallFromOutside?我的想法哪里错了?那不是你的想法错了。当您调用test.functionCallFromOutside时,它正在执行。问题在于,当函数设置_setInFunctionCalledFromOutside=时,为什么会返回为未定义?它还将更新SetInFunctionCalledFromouter属性。啊,我知道哪里出了问题,我不希望它也会更新值,但我感觉SetInFunctionCalledFromouter的行为更像一个C getter属性。。。将其更改为一个函数,然后像getter一样调用该函数,可以得到所需的结果。谢谢你的帮助!