Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么JSFIDLE和Chrome控制台返回同一函数的不同值?_Javascript_Scope - Fatal编程技术网

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已经回答了。这是一种重写代码的方法,以便在两种环境中具有相同的行为