2015-03-13 68 views
1

的是我的代码为什么函数没有被调用并且抛出错误?下面

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

    function printName(){ 
     alert(name); 
    } 

    return printName; 
} 

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

当我执行它,警告语句完美打印printName功能,但该功能调用的名称()是给一个错误,说明串是不是一个功能。如果范围是问题,则警报应打印名称而不是函数。我试图理解这里的关闭,并试图将其与JS中的范围管理混淆起来。

回答

9

您还没有宣布在外部范围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属性发生冲突。

+0

比我的更好的解释。 – DontVoteMeDown 2015-03-13 12:45:06

+0

哈哈太可笑了。我告诉他们这个问题,每个人都投票给我,因为他们固定在printName上。尽管如此,这个人解释得比我更好。 – Fata1Err0r 2015-03-13 12:48:50

+0

@ Fata1Err0r你的回答是错误的。 – DontVoteMeDown 2015-03-13 12:50:02

1

这是因为在callName()里面,你设置var name为字符串。如果你这样做:

var name = callName(); 

您将创建一个新的变种namecallName()的一个不同。

Fiddle

+0

愤怒downvote \ o/ – DontVoteMeDown 2015-03-13 12:48:16

+0

哈哈......我把你撞回了0.我也发布了正确的答案,也得到了垃圾邮件。 – Fata1Err0r 2015-03-13 12:51:50

+0

我首先发布,但詹姆斯发布了更好的解释。 – DontVoteMeDown 2015-03-13 12:53:24

相关问题