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

时间:2015-03-13 12:37:24

标签: javascript scope

以下是我的代码

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

    function printName(){
        alert(name);
    }

    return printName;
}

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

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

2 个答案:

答案 0 :(得分:9)

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

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

    function printName(){
        alert(name);
    }

    return printName;
}

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

由于window.name是窗口的名称,当你指定它时,它将字符串内容分配给窗口的名称,并且仍然是一个字符串 - 这就是你不能用{调用它的原因 - {1}}。

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

答案 1 :(得分:1)

这是因为在callName()内部将var name设置为字符串。如果你这样做:

var name = callName();

您将在name内创建一个新的变种callName()

Fiddle