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

下面代码很好的说明了这一点:

 var name = 'The Window';

 var object = {
name : 'My Object',
getNameFunc : function(){
return function(){
return this.name;
}
}
}; alert(object.getNameFunc()());

小贴士:我在写这行小代码的时候出了一个错,后来发现是一不留神name结尾的逗号写成了句号。注意,在定义对象字面量的过程中,各个属性之间要记得是用逗号分隔。

弹窗结果:‘ The Window’

问: 那么为什么匿名函数没有取得其包含作用域的this对象呢?

答:每个函数在被调用时都会自动获取两个特殊变量:this  和 arguments。 内部函数在搜索这两个变量时,指挥搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。

不过通过下面的代码可以做到这一点(直接访问外部函数中的变量):

var name = 'The Window';

var object = {
name : 'My Object',
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
}; alert(object.getNameFunc()());

弹窗显示: ‘My Object’

不同之处在于把this对象赋给了一个that变量,即使在函数返回之后,that也仍然引用这object,所以会返回object。

在有的特殊的情况下,this的值可能会发发生有意思的意外改变,下面代码:

var name = 'The Window';

var object = {
name : 'My Object',
getName : function(){
return this.name;
}
}; //alert(object.getName());
//alert((object.getName)());
alert((object.getName = object.getName)());

弹窗显示,前面两个都是‘My Object’ 后面一个是‘The Window’。

这是因为复制表达式 object.getName = object.getName这个复制表达式的值是函数本身,所以this不能得到维持,因此返回了‘The Window’ .

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

  1. js闭包中的this(匿名函数中的this指向的是windows)

    js闭包中的this(匿名函数中的this指向的是windows) 一.总结 1.普通函数中的this指向的是对象,匿名函数中的this指向的是windows,和全局变量一样 2.让匿名函数中的thi ...

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

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

  3. 闭包中的 this 对象

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

  4. js闭包中注意文字总结

    //闭包注意的点 //闭包中使用外部变量不是复制而是引用 //闭包可以节省传递参数问题 //在循环中使用闭包

  5. JS闭包中的循环绑定处理程序

    前几天工作中写前端js代码时,遇到了遍历元素给它添加单击事件.就是这个问题让我整整调了一个下午.最后还是下班回家,上网查资料才知道怎么解决的. (PS:之前也在<jQuery基础教程>第四 ...

  6. 3.jquery在js文件中获取选择器对象

    一.常用的选择器有一下几种: 1.标签选择器 2.类选择器 3.id选择器 4.并集选择器 5.层级选择器 二.如何获取选择器对象: <!DOCTYPE html> <html la ...

  7. js数组中去除重复对象及去除空对象的方法

    (function(){//去除数组中重复对象 var unique = {}; arr.forEach(function(a){ unique[ JSON.stringify(a) ] = 1 }) ...

  8. js事件中的event对象

    addEvent(oDiv,"click",function(event){ console.log(event.bubbles+"事件是否冒泡"); cons ...

  9. js数组中重复的对象去重

    var arr = [{ "name": "ZYTX", "age": "Y13xG_4wQnOWK1QwJLgg11d0pS4h ...

随机推荐

  1. error C2664

    error C2664: “int CWnd::MessageBoxW(LPCTSTR,LPCTSTR,UINT)”: 无法将参数 1 从“const char [19]”转换为“LPCTSTR” n ...

  2. android sdk镜像站点

    http://android-mirror.bugly.qq.com:8080/include/usage.html Windows A. 打开Android SDK Manager  B. 设置代理 ...

  3. 读书笔记——body and html

    在看<常见标签的默认属性值及相互作用——关于CSS reset的思考>的时候,其中说body默认的margin是8px.但是,将body的backgound-color:red:后,看到的 ...

  4. iis下设置php最大执行时间

    php在执行中常见错误: The FastCGI process exceeded configured request timeout: FastCGI process exceeded confi ...

  5. 【学习】JAVA的第一天(补)

    补上1024第一天的JAVA学习,也刚好是程序员节.今天学习了JAVA的一些历史和基础环境的配置,以及HelloWorld入门程序. JAVA体系:JAVAME(一些简单的移动端开发).JAVAEE( ...

  6. vs调试断点进不去的解决办法

    原创文章,禁止转载. 断点进不去的解决办法:  确认是debug版本  确认生成了调试信息  确认在编译和连接的工程配置中指定了相同的匹配的pdb文件名,而不是默认的vc100.pdb等名字(无关) ...

  7. jquery 传递事件的自定义数据

    整理一下 1. <script type="text/javascript">$(document).ready(function(){  $("input& ...

  8. MongoDB学习笔记-01 简介、安装

    MongoDB简介 MongoDB是一种强大.灵活.可拓展的存储方式.是一个面向文档(相当于"行"的概念)的数据库. 可拓展:通过添加服务器而增加存储量. Windows下安装 版 ...

  9. IOS对.Net返回的Base64string解析问题

    1.c#生成Base64字符串的代码 string body = "{\"title\":\"上次CVR卡其\",\"url\": ...

  10. 用sql取出来的list需要处理成map的两种情况

    1. 原生sql: select a.id,a.name from a SQLQuery sqlQuery=this.getSession().createSQLQuery(sb.toString() ...