为什么函数没有被调用并抛出错误?

why is the the function not getting called and throwing me an error?

下面是我的代码

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

    function printName(){
        alert(name);
    }

    return printName;
}

name = callName();
alert(name);
name();

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

那是因为在 callName() 中您将变量 name 设置为字符串。如果你这样做:

var name = callName();

您将创建一个新变量 namecallName() 中的变量不同。

Fiddle

你没有在外层作用域中声明name,所以它使用的是全局作用域,实际上是指向window.name。只需将其声明为局部变量,即可设置:

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

    function printName(){
        alert(name);
    }

    return printName;
}

var name = callName();
alert(name);
name();

因为window.name是window的名称,当你赋值给它时,它是将字符串内容赋给window的名称,并且仍然是一个字符串 -这就是为什么你不能用 name().

调用它的原因

请注意,这只有在这段代码本身在另一个范围内时才有效——如果它在全局范围内,即使使用 var name 也无济于事,因为它仍然会与全局 [=12] 冲突=] 属性.