这个简单的javascript脚本实际上是如何工作的(可能是范围界定的)?

fun*_*guy 10 javascript

任何人都可以为我分解如何(这看起来很简单)是由浏览器解释的:

var a = 1;
function b() {
    a = 10;
    function a() {}
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)

它将带来1.如果我将一个函数名称改为其他任何东西,等等:

var a = 1;
function b() {
    a = 10;
    function m() {}
}
b();
alert(a);
Run Code Online (Sandbox Code Playgroud)

它会提醒10.

Den*_*ret 13

声明的变量的范围是声明var它的整个函数,它不在声明点开始.它通常被描述为变量声明提升,可以看作是所有变量声明移动到函数的开头.对于函数定义,声明和"assignement"都一起移动.

function b() {
    a = 10;
    function a() {}
}
Run Code Online (Sandbox Code Playgroud)

相当于

function b() {
    var a  = function() {};
    a = 10;
}
Run Code Online (Sandbox Code Playgroud)

这意味着您声明一个新变量a,该a = 10语句只更改内部变量a,而不是外部变量.我们说内部变量会a影响外部变量.

在第二种情况下,a内部范围中没有变量,这意味着使用和更改外部变量(当查找变量时,从内部范围转到闭包链之后的最外部范围).