关于this对象

  在闭包中使用this对象也可能会导致一些问题。this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,

function createFunction(){   alert(this); }; createFunction(); // window

  而当函数被作为某个对象的方法调用时,this等于那个对象。不过,匿名函数的执行环节具有全局性,因此其this对象通常指向 window。

  但有时候由于编写闭包的方式不同,这一点可能不会那么明显。

var name = "The Window";
  var object = {
    name:"My Object",
    getNameFunc:function(){
      return function(){
        return this.name;
      };
    }
}
alert(object.getNameFunc()()); // "This Window 非严格模式下"

上面代码先创建了一个全局变量 name ,又创建了一个包含 name 属性的对象。 这个对象还包含一个方法--- getNameFunc(),它返回一个匿名函数,而匿名函数又返回 this.name。 由于getNameFunction()返回一个函数,因此调用object.getNameFunc()(),就会立即调用它返回的函数,结果就是返回一个字符串。然而,这个例子返回的字符串是"The Window" 既全局 name 变量的值。

为什么匿名函数没有取得其包含作用域(外部作用域)的this对象尼?

<1> 前面提到过,函数执行时活动对象自动会保存两个值,一个是 this 与 arguments . 内部函数搜索这两个值,只会搜索到其变量对象为止。因此永远不可能直接访问外部
函数中的这两个变量。 不过这可以使用一个变量来保存 this对象,这样就可以访问了 如下

var name = "The Window";
var object = {
  name:"My Object",
  getNameFunc:function(){
    var _this = this;
    return function(){
      return _this.name;
    };
  }
}
alert(object.getNameFunc()()); // "My Window 非严格模式下"

上述代码中 _this 变量来保存,而在定义闭包之后,闭包也可以访问这个变量,因为它是我们在包含函数中特意声明的一个变量。
即使返回后调用,其_this任然引用着 object, 所以调用 object.getNameFunc()()就返回了“My Object” 如下图

闭包中的 this 对象的更多相关文章

  1. 关于javascript闭包中的this对象

    我们知道, this对象是运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象.<Javascript高级程序设计&g ...

  2. JS闭包中的this对象

    我们知道,当函数被作为某个对象的方法调用时,this等于那个对象,不过,匿名函数的执行环境具有全局性,因此其this对象通常指向window. 下面代码很好的说明了这一点: var name = 'T ...

  3. Javascript中的this对象

    对于this的使用,我们最常遇到的主要有,在全局函数中,在对象方法中,call和apply时,闭包中,箭头函数中以及class中: 我们知道this对象是在运行时基于函数的执行环境绑定的,在调用函数之 ...

  4. Python中的函数对象与闭包

    函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 #foo.py def callf(func): ...

  5. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  6. 闭包中this指向window的原因

    var t={ b:1, w:function a(){ var b=2; alert(this.b); //弹出t对象的b属性 alert(b); //弹出a函数的b变量 return functi ...

  7. js中获取事件对象的方法小结

    原文地址:http://jingyan.baidu.com/article/d8072ac4594d6cec95cefdac.html 事件对象 的获取很简单,很久前我们就知道IE中事件对象是作为全局 ...

  8. 编写高质量代码改善C#程序的157个建议——建议38:小心闭包中的陷阱

    建议38:小心闭包中的陷阱 先看一下下面的代码,设想一下输出的是什么? static void Main(string[] args) { List<Action> lists = new ...

  9. 闭包中的this

    var name="pushline";//全局变量 var obj=new Object(); obj.name="jms"; obj.getName=fun ...

随机推荐

  1. PHP+mysql统计排名第几位

    正在开发积分系统!其中有一项数据是显示用户积分排名?一下子想不到太好的办法! 最简的情况是统一某一字段的积分数据排名?比如积分字段,里面存的整数! 如何排名?或者说如何获得他在排序中的序列位次呢? s ...

  2. mysql中的JOIN用法总结

    join是mysql中一个基础的关键词,一般在多表连接查询中使用,这里做一下总结 1.JOIN的语法格式 table_references: table_reference [, table_refe ...

  3. MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件

    需要MySQL数据库支持的狐友们有福了,MySQL和MsSQL实时自动同步---SyncNavigator 数据库同步软件   使用SyncNavigator轻松实现数据库异地同步.断点续传.异构同步 ...

  4. Java订单号(时间加流水号)

    import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.Fi ...

  5. APKTool用法

    APKTool是GOOGLE提供的APK编译工具,需要JAVA运行环境,推荐使用JDK1.6或者JDK1.7. 如果你想对APK文件进行修改,那么就不可避免的要使用到APKTool.论坛里有很多关于R ...

  6. Javascript Array Distinct (array.reduce实现)

    javascript 没有原生的Distinct功能 . (至少现在还没有)但我们可以通过简单的script 自己实现 . Distinct就是把数组中重复出现2次或以上的值给删除掉,确保数组内每个值 ...

  7. PCB敷铜小结

    有人说加大敷铜可以加大散热面,其实,对于此我不以为然.我说过铜是一种散热吸热快的金属,如果加大散热面要靠加大敷铜的面积的话,那就没有必要给很多的器件加热片了,我想大家对于计算机都颇有心得,一定攒过电脑 ...

  8. rsyslog 同步丢失问题

    <pre name="code" class="html">[root@dr-mysql01 zjzc_log]# wc -l localhost_ ...

  9. google官方提供的下拉刷新控件SwipeRefreshLayout

    摘自:http://www.stormzhang.com/android/2014/03/29/android-swiperefreshlayout/ SwipeRefreshLayout Swipe ...

  10. POJ_3083——贴左右墙DFS,最短路径BFS

    Description The cornfield maze is a popular Halloween treat. Visitors are shown the entrance and mus ...