分配给函数会覆盖函数还是创建隐式全局?

时间:2017-03-10 05:01:09

标签: javascript function function-declaration dynamic-typing

在JavaScript中,我们可以声明一个函数然后分配给它,如下所示:

function spam() { return "spam 'n eggs"; }
spam = spam();
spam(); // TypeError: spam is not a function.

此代码是否会更改名为 spam 的全局变量的值,或者创建隐藏功能 spam 的隐式全局变量?

2 个答案:

答案 0 :(得分:1)

它不会覆盖该函数,但它会为该变量分配一个字符串。在第一行定义的函数返回一个字符串,因为第二行设置spam等于返回值(因为函数被调用(注意括号))垃圾邮件然后是string。< / p>

在浏览器控制台中尝试此操作:window.spam。在第一行之后,它应该显示该功能。然后在第二行之后它应该显示该字符串。

&#13;
&#13;
function spam() {
  return "spam 'n eggs";
}
console.log('typeof spam: ',typeof spam, 'typeof window.spam: ',typeof window.spam);
spam = spam(); //spam is assigned a string
console.log('typeof spam: ',typeof spam, 'typeof window.spam: ',typeof window.spam);
spam(); // TypeError: spam is not a function.
&#13;
&#13;
&#13;

如果我们将代码移到函数中,var关键字可以用于本地范围:

&#13;
&#13;
function assignSpam() {
        var spam = function() { return "spam 'n eggs"; }
        console.log('typeof spam after initial assignment: ',typeof spam);
        spam = spam(); //spam is assigned a string
        console.log('typeof spam after assigning to spam(): ',typeof spam);
        spam(); // TypeError: spam is not a function.
    }
    assignSpam();
    spam; //undefined
&#13;
&#13;
&#13;

服务器端javascript(例如NodeJS)的结果应该类似。

答案 1 :(得分:1)

  

此代码是否会覆盖名为spam的全局变量

所持有的函数

没有。分配给垃圾邮件的初始值是对该函数的引用。分配新值不会改变功能,只会为垃圾邮件分配新值。

E.g。

function spam(){return 'I am spam';}

var b = spam;

spam = spam();

console.log(spam) // 'I am spam'

console.log(b);   // Original "spam" function

console.log(b()); // 'I am spam'

  

或创建一个隐藏全局变量来隐藏函数垃圾邮件?

它只是为垃圾邮件分配了一个新值。原始函数对象仍然存在,但如果没有其他引用,它可用于垃圾收集。