匿名函数里的this的执行环境和指向--javascript

重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下。

var name = "The Window";
      var object = {
        name : "My Object",
        getNameFunc : function(){
          return function(){
            return this.name;
          };
        }
      };
      alert(object.getNameFunc()());输出 The Window

一.匿名函数的执行环境具有全局性,因此其this对象通常指向window,也可以称的上是window对象的方法的验证

var a = 100;
      (function  () {
          console.log(a);
          console.log(this.a);
          console.log(window.a);
      })()
输出
100
100
100
(function  () {
          this.a = 200;
      })();

       console.log(window.a);
       console.log(this.a);
       console.log(a);

输出
200
200
200

上面两个例子验证了匿名函数的上下文环境是window

二.将闭包的题改一下来验证匿名函数的this

var object = {
        name : "My Object",
        getNameFunc : function(){
          return function(){
                   if (this===window)
                       {return "匿名函数的上下文环境是window";}
                   else
                       {return "匿名函数的上下文环境不是window";};
           
          };
        }
      };
      alert(object.getNameFunc()());

//输出  匿名函数的上下文环境是window

三.下面是从网上看的一篇文章上的代码

function foo() {

    if (this===window) {
        document.write("call a function");
    }
    else{
        document.write("call a function or method");
    }
    }

    function MyObject(name) {
        // 下面的this指代new关键字新创建实例
        this.name = name;
        this.foo = function(){
            document.write("call a method, by object: ", this.name, " ; and then ");
            foo();
        };
    }

    var obj1 = new MyObject("obj1");
    var obj2 = new MyObject("obj2");

    // 测试1: 作为函数调用
    foo();        //Output=>call a function.

    // 测试2: 作为对象方法的调用
    obj1.foo();    //Output=>call a method, by object: obj1 ; and then call a function.
    obj2.foo();    //Output=>call a method, by object: obj2 ; and then call a function.

    // 测试3: 将函数作为“指定对象的”方法调用
    foo.call(obj1);    //Output=>call a function or method.
    foo.apply(obj2);    //Output=>call a function or method.

全局foo()函数也是方法,它其实是其上下文环境(window)的方法

参考:

http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

http://www.ibm.com/developerworks/cn/web/1207_wangqf_jsthis/

上一篇:cocos2dx && Lua 环境配置


下一篇:使用TCP协议的NAT穿透技术 (转载)