关于普通函数调用和全局变量的定义 - pod4g/tool GitHub Wiki


;(function(document, undefined) {

  console.log("外层的自执行函数:"+this);// 1 window
  document.addEventListener('DOMContentLoaded', function() {

        
        console.log("DOM Ready:"+this); // 2 HTMLDocument


        var test = function (){
            var name = "liyanfeng";
            function test2(){

                console.log("test2:"+this); // 3 window
                console.log("test2:"+name); // 4 liyanfeng

                function test3(){
                    console.log("test3:"+this); // 5 window

                    function test4(){
                      console.log("test4:"+this); // 6 window

                        (function(){
                            console.log("test4内部的自执行函数(在其内定义了a变量,没用var):"+this); //7 window
                            a = '李彦峰';
                        })()
                    }
                    test4();
                }
                test3();

            }
            test2();

        }
        test();

    
  }, false);

})(document);

window.onload = function(){
    console.log("onload:"+a); // 8 李彦峰
}

打印结果及顺序如下

  1. 外层的自执行函数:[object Window]
  2. DOM Ready:[object HTMLDocument]
  3. test2:[object Window]
  4. test2:liyanfeng
  5. test3:[object Window]
  6. test4:[object Window]
  7. test4内部的自执行函数(在其内定义了a变量,没用var):[object Window]
  8. onload:李彦峰

结论如下:

  1. 普通的函数调用,包括自执行函数与函数表达式,内部的this都是window,不管嵌套多深都是这样
  2. 在函数内部定义变量只要是不加var,就一定在是全局变量,不管嵌套多深都是这样