Javascript 为什么函数没有被调用并向我抛出一个错误?

Javascript 为什么函数没有被调用并向我抛出一个错误?,javascript,scope,Javascript,Scope,下面是我的代码 function callName() { var name="x"; function printName(){ alert(name); } return printName; } name = callName(); alert(name); name(); 当我执行它时,alert语句完美地打印了printName函数,但函数调用名给出了一个错误,声明字符串不是函数。如果范围是问题所在,则警报应该打印名称而不是函数。

下面是我的代码

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

    function printName(){
        alert(name);
    }

    return printName;
}

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

这是因为在callName中,您将var名称设置为string。如果您这样做:

var name = callName();
您将创建一个新的var名称,该名称与callName中的名称不同

这是因为在callName中,您将var名称设置为string。如果您这样做:

var name = callName();
您将创建一个新的var名称,该名称与callName中的名称不同

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

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

    function printName(){
        alert(name);
    }

    return printName;
}

var name = callName();
alert(name);
name();
由于window.name是窗口的名称,当您分配给它时,它将字符串内容分配给窗口的名称,并且仍然是一个字符串-这就是为什么您不能用name调用它

请注意,只有当代码本身在另一个作用域中时,这才有效-如果它在全局作用域中,即使使用var name也没有帮助,因为它仍然会与global window.name属性冲突。

您没有在外部作用域中声明名称,因此它使用的是全局作用域,并且实际上指向window.name。只需将其声明为局部变量,即可设置:

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

    function printName(){
        alert(name);
    }

    return printName;
}

var name = callName();
alert(name);
name();
由于window.name是窗口的名称,当您分配给它时,它将字符串内容分配给窗口的名称,并且仍然是一个字符串-这就是为什么您不能用name调用它


请注意,只有当代码本身在另一个作用域内时,这才有效-如果它在全局作用域上,即使使用var name也没有帮助,因为它仍然会与global window.name属性冲突。

比我的解释更好。lol太有趣了。我把这个问题告诉了他们,每个人都投了我的票,因为他们对printName一窍不通。同意,但这家伙解释得比我好。哈哈,除了我发布了和你一样的东西,没有详细说明他们应该如何编写所有代码。你是说,即使我将一个对象实例分配给name,它仍然会转换为字符串,然后分配给..?@BlackPanther,假设你还在谈论window.name。如果它是一个正态变量,那很好。比我的解释更好。哈哈,太有趣了。我把这个问题告诉了他们,每个人都投了我的票,因为他们对printName一窍不通。同意,但这家伙解释得比我好。哈哈,除了我发布了和你一样的东西,没有详细说明他们应该如何编写所有代码。你是说,即使我将一个对象实例分配给name,它仍然会转换为字符串,然后分配给..?@BlackPanther,假设你还在谈论window.name。如果它是一个正态变量,那很好。哈哈。。。我把你撞到0了。我也发布了正确的答案,也收到了垃圾邮件。我先发布了,但詹姆斯发布了一个更好的解释。VoteUp,解释问题,容易得到,很好的解决方案:同意。我坐在这里看着所有的事情都过去了。不知道为什么他们会投票否决你,即使詹姆斯解释得更好。你说的还是对的。事实上,不管你是否使用var,callName外部的变量名与函数内部的变量名是不同的。哈哈。。。我把你撞到0了。我也发布了正确的答案,也收到了垃圾邮件。我先发布了,但詹姆斯发布了一个更好的解释。VoteUp,解释问题,容易得到,很好的解决方案:同意。我坐在这里看着所有的事情都过去了。不知道为什么他们会投票否决你,即使詹姆斯解释得更好。实际上,不管你是否使用var,callName外部的变量名与函数内部的变量名是不同的。