为什么函数没有被调用并抛出错误?
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();
您将创建一个新变量 name
与 callName()
中的变量不同。
你没有在外层作用域中声明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] 冲突=] 属性.
下面是我的代码
function callName() {
var name="x";
function printName(){
alert(name);
}
return printName;
}
name = callName();
alert(name);
name();
当我执行它时,警报语句完美地打印了 printName 函数,但是函数调用 name() 给出了一个错误,指出字符串不是一个函数。如果范围是问题,警报应该打印名称而不是函数。我试图在这里理解闭包,并且正在尝试这个,但对 js 中的范围管理感到困惑。
那是因为在 callName()
中您将变量 name
设置为字符串。如果你这样做:
var name = callName();
您将创建一个新变量 name
与 callName()
中的变量不同。
你没有在外层作用域中声明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] 冲突=] 属性.