全局作用域

    不在任何函数内定义的变量就具有全局作用域。实际上,JavaScript默认有一个全局对象 window ,全局作用域的变量实际上被绑定到 window 的一个属性:

    'use strict';



    var course = 'Learn JavaScript';

    alert(course); // 'Learn JavaScript'

    alert(window.course); // 'Learn JavaScript'

    因此,直接访问全局变量 course 和访问 window.course 是完全一样的。

    你可能猜到了,由于函数定义有两种方式,以变量方式 var foo = function () {} 定义的函数实际上也是一个全局变量,因此,顶层函数的定义也被视为一个全局变量,并绑定到 window 对象:

    'use strict';



    function foo() {

    alert('foo');

    }



    foo(); // 直接调用foo()

    window.foo(); // 通过window.foo()调用

    进一步大胆地猜测,我们每次直接调用的 alert() 函数其实也是 window 的一个变量:

    'use strict';



    window.alert('调用window.alert()');

    // 把alert保存到另一个变量:

    var old_alert = window.alert;

    // 给alert赋一个新函数:

    window.alert = function () {}



    alert('无法用alert()显示了!');



    // 恢复alert:

    window.alert = old_alert;

    alert('又可以用alert()了!');

    这说明JavaScript实际上只有一个全局作用域。任何变量(函数也视为变量),如果没有在当前函数作用域中找到,就会继续往上查找,最后如果在全局作用域中也没有找到,则报ReferenceError错误。