Javascript 这两个功能的范围有什么区别

Javascript 这两个功能的范围有什么区别,javascript,function,scope,Javascript,Function,Scope,如果这太幼稚,我很抱歉,只是在回答另一个问题时遇到了这个问题。:)在下面的代码中,bar.x和bar.y具有类似/相同的函数体(函数最初在何处声明是否重要?)。我猜foo的作用域在分配给y时丢失了,但是当我调用bar.y()时,它为什么不将全局变量放在闭包内呢?x和y是否都可以输出300 global\u var=2 var foo=函数(){ console.log(“y”,全局变量) } var bar=(函数b(){ var global_var=300; var x=函数(){ con

如果这太幼稚,我很抱歉,只是在回答另一个问题时遇到了这个问题。:)在下面的代码中,
bar.x
bar.y
具有类似/相同的函数体(函数最初在何处声明是否重要?)。我猜
foo
的作用域在分配给
y
时丢失了,但是当我调用
bar.y()
时,它为什么不将
全局变量
放在闭包内呢?
x
y
是否都可以输出
300

global\u var=2
var foo=函数(){
console.log(“y”,全局变量)
}
var bar=(函数b(){
var global_var=300;
var x=函数(){
console.log(“x”,全局变量);
};
变量y=foo;
返回{x:x,y:y};
})();
bar.x()//300
bar.y()//2.
设置超时(bar.x)//300

设置超时(bar.y)//2
foo
分配给
y
不涉及闭包。函数
foo
的作用域由定义在哪里决定,它位于代码示例的顶部,该函数体中的
global\u var
将始终引用第1行中(隐式)定义的
global\u var
变量,而不是任何具有相同名称的其他变量

foo
分配给
y
对该功能的范围没有影响。赋值所完成的全部工作是使
foo
可以从一个新变量访问

有没有办法让x和y都输出300

当函数被这样定义时,情况并非如此,但是如果您使用
this
,您可能会得到与预期类似的结果:

global\u var=2
var foo=函数(){
console.log(“y”,this.global_var)
}
var bar=(函数b(){
var global_var=300;
var x=函数(){
log(“x”,this.global_var);
};
变量y=foo;
返回{x:x,y:y,全局变量:全局变量};
})();
foo();//2.
bar.x();//300
bar.y();//300
设置超时(bar.x);//2.
设置超时(bar.y);//2.
setTimeout(bar.x.bind(bar));//300

设置超时(bar.y.bind(bar));//300
foo
分配给
y
不涉及闭包。函数
foo
的作用域由定义在哪里决定,它位于代码示例的顶部,该函数体中的
global\u var
将始终引用第1行中(隐式)定义的
global\u var
变量,而不是任何具有相同名称的其他变量

foo
分配给
y
对该功能的范围没有影响。赋值所完成的全部工作是使
foo
可以从一个新变量访问

有没有办法让x和y都输出300

当函数被这样定义时,情况并非如此,但是如果您使用
this
,您可能会得到与预期类似的结果:

global\u var=2
var foo=函数(){
console.log(“y”,this.global_var)
}
var bar=(函数b(){
var global_var=300;
var x=函数(){
log(“x”,this.global_var);
};
变量y=foo;
返回{x:x,y:y,全局变量:全局变量};
})();
foo();//2.
bar.x();//300
bar.y();//300
设置超时(bar.x);//2.
设置超时(bar.y);//2.
setTimeout(bar.x.bind(bar));//300
设置超时(bar.y.bind(bar));//300
函数最初在何处声明是否重要

对。函数的范围仅由其声明的位置决定

我猜当一个foo被分配给y时,它的作用域就丢失了

没有。范围没有改变

当我调用bar.y()时,为什么它不在闭包中使用全局变量

因为函数的作用域完全由其声明的位置决定

有没有办法让x和y都输出300

不是通过玩弄范围

您必须重写函数才能从其他地方获取数据,例如从对象属性

var global_object={};
全局_object.data=1;
全局_object.foo=函数(){
console.log(“y”,this.data);
};
var bar=(函数b(){
var local_object={};
本地_object.data=2;
local_object.x=函数(){
console.log(“x”,this.data);
};
local_object.y=global_object.foo;
返回局部对象;
})();
bar.x();//2.
bar.y();//2.
setTimeout(bar.x.bind(bar));//2.
设置超时(bar.y.bind(bar));//2
函数最初在何处声明是否重要

对。函数的范围仅由其声明的位置决定

我猜当一个foo被分配给y时,它的作用域就丢失了

没有。范围没有改变

当我调用bar.y()时,为什么它不在闭包中使用全局变量

因为函数的作用域完全由其声明的位置决定

有没有办法让x和y都输出300

不是通过玩弄范围

您必须重写函数才能从其他地方获取数据,例如从对象属性

var global_object={};
全局_object.data=1;
全局_object.foo=函数(){
console.log(“y”,this.data);
};
var bar=(函数b(){
var local_object={};
本地_object.data=2;
local_object.x=函数(){
console.log(“x”,this.data);
};
local_object.y=global_object.foo;
返回局部对象;
})();
bar.x();//2.
bar.y();//2.
setTimeout(bar.x.bind(bar));//2.

设置超时(bar.y.bind(bar));//2
我想我的
这个
和词法范围的概念混淆了。我想我的
这个
和词法范围的概念混淆了。我试图改变词法范围,就像我们绑定
这个
一样。现在我明白我在哪里了