只要你写一点js代码,它就是一个非常简单的变种。js编译器发生了什么它从代码一步一步开始。
复制代码代码如下所示:
x=1;
警报(x);
函数(){()
警报(x);
变量x=2;
警报(x);
}
(y);

上面的代码也会给你正确的答案:1,定义,2。对我来说,第一反应就是输出:1,1, 2.why二将输出定义的我已经在上面定义了一个全局变量X,为什么你找不到呢

这是因为:当js编译器执行这个Y函数时,它会将其正文中的声明变量提前到前面做声明。例如:var = 2;编译器首先在主体前面执行一个var x声明。事实上,上面的代码相当于代码的下面部分:
复制代码代码如下所示:
x=1;
警报(x);
在这个时候,函数不是赋值,所以没有定义。
警报(x);
x=2;
警报(x);
}
(y);

所以不难理解x =未定义。但是如果var x=2,这个代码被删除了,而且它内部不做var声明,它总是沿着范围向上看,此时x是全局x。
然后看看一个更有趣的例子。
复制代码代码如下所示:
var a = 1;
函数B(){
a = 10;
返回;
}
(b);
警报(a);
中
var a=1;
函数B(){
a = 10;
返回;
函数(a){
}();警报(a);

例子很简单,第一个例子是输出10,第二个例子输出1,这是为什么此外,我还有第二个返回示例,它应该输出10!那时,因为JS编译器在后面。
这两个代码是函数(a){的第二个例子之间的区别;然后函数内部也没有,也没有调用它。

事实上,js编译器将函数A(后面)编译为var =函数(){ },此时,函数内部也有一个A = 10;外部A仍然是1;根据js范围,您会发现内部第一个。如果你找不到它,你会在第一级找到它。
最公开的警报(a)将显示1;