为什么函数没有被调用并给我一个错误?

Thi*_*thi 1 javascript scope

以下是我的代码

function callName() {
    var name="x";

    function printName(){
        alert(name);
    }

    return printName;
}

name = callName();
alert(name);
name();
Run Code Online (Sandbox Code Playgroud)

当我执行它时,alert语句正在完美地打印printName函数,但函数调用name()给出一个错误,指出字符串不是函数.如果范围是问题,警报应该打印名称而不是函数.我试图理解这里的闭包,并试图解决这个问题并与js中的范围管理混淆.

Jam*_*rpe 9

您尚未name在外部作用域中声明,因此它使用全局作用域,并且实际指向window.name.只需将其声明为局部变量,然后设置:

function callName() {
    var name="x";

    function printName(){
        alert(name);
    }

    return printName;
}

var name = callName();
alert(name);
name();
Run Code Online (Sandbox Code Playgroud)

既然window.name是窗口的名称,当你指定它时,它将字符串内容分配给窗口的名称,并且仍然是一个字符串 - 这就是你无法调用它的原因name().

请注意,这仅在此代码本身位于另一个范围内时才有效 - 如果它位于全局范围内,即使使用var name也无济于事,因为它仍将与全局window.name属性冲突.