以下是我的代码
function callName() {
var name="x";
function printName(){
alert(name);
}
return printName;
}
name = callName();
alert(name);
name();
当我执行它时,alert语句正在完美地打印printName函数,但是函数调用name()给出了一个错误,指出字符串不是函数。如果范围是问题,警报应该打印名称而不是函数。我试图理解这里的闭包,并试图将其与js中的范围管理混淆。
答案 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)