函数中函数内javascript变量的作用域
有人能解释一下下面的代码吗?为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量?我知道我可以在子函数中使用“this”来访问父函数中的“inside”变量,但我不明白为什么需要这样做。。。。当我可能想要更静态的东西时,我是否有效地创建了类实例?我一直在使用这个模式包装javascript功能,但现在我想知道是否有更好/更简单的模式可以避免变量封装的挑战(更静态的东西)?谢谢你的见解函数中函数内javascript变量的作用域,javascript,Javascript,有人能解释一下下面的代码吗?为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量?我知道我可以在子函数中使用“this”来访问父函数中的“inside”变量,但我不明白为什么需要这样做。。。。当我可能想要更静态的东西时,我是否有效地创建了类实例?我一直在使用这个模式包装javascript功能,但现在我想知道是否有更好/更简单的模式可以避免变量封装的挑战(更静态的东西)?谢谢你的见解 var wrap=function(){ var-inside=null
var wrap=function(){
var-inside=null;
函数showInside(){
控制台日志(内部);
}
函数changeinder(){
控制台日志(内部);
内部+=‘测试’;
}
返回{
里面:里面,,
showInside:showInside,
changeind:changeind
};
}();
wrap.changeinder();
wrap.showInside();
wrap.changeinder();
wrap.showInside();
控制台日志(包装在内部)代码>
为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量
是的
你很困惑,因为当你说:
return {
inside:inside,
将变量inside
的值复制到新对象的属性inside
。您可以在创建对象时执行此操作
稍后更改变量的值时,它与属性没有关联,因此属性不会更新
您需要使用getter/setter将属性链接到变量
var wrap=function(){
var-inside=null;
函数showInside(){
控制台日志(内部);
};
函数changeinder(){
控制台日志(内部);
内部+=‘测试’;
}
返回{
进去{
返回内部;
},
设置内部(值){
内=值;
},
showInside:showInside,
changeind:changeind
};
}();
wrap.changeinder();
wrap.showInside();
wrap.changeinder();
wrap.showInside();
控制台日志(包装在内部)代码>
为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量
是的
你很困惑,因为当你说:
return {
inside:inside,
将变量inside
的值复制到新对象的属性inside
。您可以在创建对象时执行此操作
稍后更改变量的值时,它与属性没有关联,因此属性不会更新
您需要使用getter/setter将属性链接到变量
var wrap=function(){
var-inside=null;
函数showInside(){
控制台日志(内部);
};
函数changeinder(){
控制台日志(内部);
内部+=‘测试’;
}
返回{
进去{
返回内部;
},
设置内部(值){
内=值;
},
showInside:showInside,
changeind:changeind
};
}();
wrap.changeinder();
wrap.showInside();
wrap.changeinder();
wrap.showInside();
控制台日志(包装在内部)代码>我想你在概念上有问题。让我们看看:
var wrap = function(){
...
}();
最后一个()
表示您没有将函数分配给wrap
,而是调用函数并将其返回值分配给wrap
返回值为
return {
inside:inside, //The value of inside (null)
showInside:showInside, //The local function showInside
changeInside:changeInside //The local function changeInside
};
请看,在wrap中没有变量在中。在中,只有调用函数时的值
首先,您可能需要执行以下操作:
var wrap = function() {
....
return this; //Return the object itself
}();
然后,函数中的变量和函数属于函数的作用域。无法从该范围之外访问。因此,您可以定义属性
现在:
console.log(wrap.inside); //-> 1
console.log(wrap.insideVar); //-> undefined
console.log(wrap.changeInside());
console.log(wrap.showInside); //-> 4 and 2
console.log(wrap.inside); //-> 2
希望差别很明显。否则,请你再解释一下。我想你在概念上有问题。让我们看看:
var wrap = function(){
...
}();
最后一个()
表示您没有将函数分配给wrap
,而是调用函数并将其返回值分配给wrap
返回值为
return {
inside:inside, //The value of inside (null)
showInside:showInside, //The local function showInside
changeInside:changeInside //The local function changeInside
};
请看,在wrap中没有变量在中。在中,只有调用函数时的值
首先,您可能需要执行以下操作:
var wrap = function() {
....
return this; //Return the object itself
}();
然后,函数中的变量和函数属于函数的作用域。无法从该范围之外访问。因此,您可以定义属性
现在:
console.log(wrap.inside); //-> 1
console.log(wrap.insideVar); //-> undefined
console.log(wrap.changeInside());
console.log(wrap.showInside); //-> 4 and 2
console.log(wrap.inside); //-> 2
希望差别很明显。否则,请您进一步解释。问题到底是什么?您的问题与功能完全无关。下面是您看到的内容的简化版本:var foo=42;var obj={foo:foo};foo=21;控制台日志(obj.foo)代码>。JavaScript是按值传递的{foo:foo}
将foo
的值的副本分配给属性foo
。我认为在JavaScript中谈论传递值是令人困惑的,因为您还可以将引用作为值传递。如果foo
是一个对象,则不会指定该对象的副本,而是指定该对象引用的副本。@HubertGrzeskowiak:如果不知道,任何事情都会令人困惑。是一个很好的读物。@HubertGrzeskowiak不,JS总是按值传递。您可以传递引用值(对象)只是其中的一部分。问题到底是什么?您的问题与函数没有任何关系。下面是您看到的内容的简化版本:var foo=42;var obj={foo:foo};foo=21;控制台日志(obj.foo)代码>。JavaScript是按值传递的{foo:foo}
将foo
的值的副本分配给属性foo
。我想说到pass-by-va