函数中函数内javascript变量的作用域

函数中函数内javascript变量的作用域,javascript,Javascript,有人能解释一下下面的代码吗?为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量?我知道我可以在子函数中使用“this”来访问父函数中的“inside”变量,但我不明白为什么需要这样做。。。。当我可能想要更静态的东西时,我是否有效地创建了类实例?我一直在使用这个模式包装javascript功能,但现在我想知道是否有更好/更简单的模式可以避免变量封装的挑战(更静态的东西)?谢谢你的见解 var wrap=function(){ var-inside=null

有人能解释一下下面的代码吗?为什么内部函数不访问同一父函数中的“inside”变量?但它们似乎与对等函数共享同一个变量?我知道我可以在子函数中使用“this”来访问父函数中的“inside”变量,但我不明白为什么需要这样做。。。。当我可能想要更静态的东西时,我是否有效地创建了类实例?我一直在使用这个模式包装javascript功能,但现在我想知道是否有更好/更简单的模式可以避免变量封装的挑战(更静态的东西)?谢谢你的见解

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