重新看了下闭包,在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/

匿名函数里的this的执行环境和指向--javascript的更多相关文章

  1. python 匿名函数捕获变量值 (执行时的值)

  2. Javascript的匿名函数与自执行

    1.匿名函数 函数是JavaScript中最灵活的一种对象,这里只是讲解其匿名函数的用途.匿名函数:就是没有函数名的函数. 1.1 函数的定义,首先简单介绍一下函数的定义,大致可分为三种方式 第一种: ...

  3. Javascript 函数及其执行环境和作用域

    函数在javascript中可以说是一等公民,也是最有意思的事情,javascript函数其实也是一个对象,是Function类型的实例.因此声明一个函数首先可以使用 Function构造函数: va ...

  4. JavaScript基础---作用域,匿名函数和闭包

    匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...

  5. JavaScript基础---作用域,匿名函数和闭包【转】

    匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数. 一.匿名函数 //普通函数 function box() { //函数名是 box return 'TT'; } //匿名函数 f ...

  6. 第一百一十节,JavaScript匿名函数和闭包

    JavaScript匿名函数和闭包 学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂 ...

  7. 浅谈JavaScript匿名函数与闭包

    一. 匿名函数   //普通函数定义: //单独的匿名函数是无法运行的.就算运行了,也无法调用,因为没有名称. 如: function(){             alert('123');    ...

  8. JavaScript(第十五天)【匿名函数和闭包】

      学习要点: 1.匿名函数 2.闭包 匿名函数就是没有名字的函数,闭包是可访问一个函数作用域里变量的函数.声明:本节内容需要有面向对象和少量设计模式基础,否则无法听懂.(所需基础15章的时候已经声明 ...

  9. javascript 作用域链及闭包,AO,VO,执行环境

    下面的文章内容会根据理解程度不断修正. js变量作用域: 定义:变量在它申明的函数体以及函数体内嵌套的任意函数体内有定义. function AA(){ var bb='我是AA内部变量'; func ...

随机推荐

  1. CNS数据库网站开发环境的配置

    1)下载wamp服务器.使用php来开发 2)配置mysql服务器,主要把原来已有的数据导入到wamp服务器的mysql.改mysql的my.ini里德datadir的地址即可,将datadir设为已 ...

  2. Android导入工程,R 资源文件无法生成

    在Android中使用开源代码或者自己开发项目的时候,经常会遇到R.java文件丢失的情况,如何重新生成呢?网上一般给出这样的两种方法: 方法 1:右击你的工程(项目)——>Android To ...

  3. C++Builder 中动态数组的使用(转)

    源:http://i.cnblogs.com/EditPosts.aspx?opt=1 和AnsiString类型一样,动态数组是为了和DELPHI中的动态数组相兼容而定义,在BCB中,动态数组是用模 ...

  4. JAVA和C++区别

    1.指针 JAVA语言让编程者无法找到指针来直接访问内存无指针,并且增添了自动的内存管理功能,从而有效地防止了c/c++语言中指针操作失误,如野指针所造成的系统崩溃.但也不是说JAVA没有指针,虚拟机 ...

  5. (转) hadoop 一个Job多个MAP与REDUCE的执行

    http://blog.csdn.net/chaoping315/article/details/6221440 在hadoop 中一个Job中可以按顺序运行多个mapper对数据进行前期的处理,再进 ...

  6. Python3基础 定义有参数有返回值函数 对传入的参数加1

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  7. Linq to SQL 简单的增删改操作

    Linq to SQL 简单的增删改操作. 新建数据库表tbGuestBook.结构如下: 新建web项目,完成相应的dbml文件.留言页面布局如下 <body> <form id= ...

  8. CG之refract函数简单实现

    CG的refract函数定义如下: refract(I, N, eta) 根据入射光线方向I,表面法向量N和折射相对系数eta,计算折射向量.如果对给定的eta,I和N之间的角度太大,返回(0,0,0 ...

  9. dedecms自定义表单

  10. c#中控制不能从一个case标签贯穿到另一个case标签

    每个非空的case标签都得以break结束,肯定是两个case之间少了一个break了