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
我想我的这个
和词法范围的概念混淆了。我想我的这个
和词法范围的概念混淆了。我试图改变词法范围,就像我们绑定这个
一样。现在我明白我在哪里了