为什么没有调用该函数并给我抛出错误

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

本文关键字:出错 错误 函数 调用 为什么      更新时间:2023-09-26

下面是我的代码

function callName() {
    var name="x";
    function printName(){
        alert(name);
    }
    return printName;
}
name = callName();
alert(name);
name();

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

您尚未在外部作用域中声明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 也无济于事,因为它仍然会与全局window.name属性冲突。

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

var name = callName();

您将创建一个与 callName() 内部不同的新变量name

小提琴

相关文章: