Javascript 为什么JSFIDLE和Chrome控制台返回同一函数的不同值?
我在Javascript 为什么JSFIDLE和Chrome控制台返回同一函数的不同值?,javascript,scope,Javascript,Scope,我在JSfiddle中有以下代码 var a = 1; function five() { this.a = 5; console.log(a); //JSfiddle prints the value 1 } five() 但是当我在Chrome控制台中粘贴相同的代码时,函数five()会打印5。为什么?默认情况下,JSFIDLE将代码包装在窗口中。onload事件,因此您实际上运行的是: window.onload = function() { var a =
JSfiddle
中有以下代码
var a = 1;
function five() {
this.a = 5;
console.log(a); //JSfiddle prints the value 1
}
five()
但是当我在Chrome控制台中粘贴相同的代码时,函数
five()
会打印5。为什么?默认情况下,JSFIDLE将代码包装在窗口中。onload
事件,因此您实际上运行的是:
window.onload = function() {
var a = 1;
function five() {
this.a = 5;
console.log(a); //JSfiddle prints the value 1
}
five()
}
这意味着a
是该函数的本地对象,而this
仍然引用全局对象(window
)。在Chrome控制台中,没有包装函数,var a
正在创建一个全局变量,它是,因此与window.a
/this.a
相同
如果您转到JavaScript选项并选择“nowrap”选项中的任何一个,它也将在JSFIDLE中记录5
:
我会以这种方式编写代码,使其“无处不在”
var obj = {};
obj.a = 1;
obj.foo = function five() {
this.a = 5;
window.alert(this.a);
}
obj.foo();
可能是因为吊装。在jsiddle中,将加载类型从onDomReady更改为,并查看您在jsiddle中看到了什么&它被包装在body@user2181397它在我的机器上返回1。这与我们是使用不同版本的谷歌浏览器还是JSFIDLE本身的用户设置有关。我在没有以用户身份登录的情况下将代码粘贴到那里,它返回1。@user2181397使用“No wrap”选项正是解决这个问题的方法。这并不能真正回答它为什么这样做的问题。James Thorpe已经回答了。这是一种重写代码的方法,以便在两种环境中具有相同的行为