从阮老师博客的一道测试题说起:

代码段一:

  1. var name = "The Window";
  2.   var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.       return function(){
  6.         return this.name;
  7.       };
  8.     }
  9.   };
  10. alert(object.getNameFunc()());

代码段二:

  1. var name = "The Window";
  2.   var object = {
  3.     name : "My Object",
  4.     getNameFunc : function(){
  5.       var that = this;
  6.       return function(){
  7.         return that.name;
  8.       };
  9.     }
  10.   };
  11. alert(object.getNameFunc()());

这两段代码是为了巩固javascript中闭包的用法,但是如果不了解javascript中this的用法的话,很难理解这两段代码的真正意思。

从这个例子入手,首先了解javascript中this的指向。

This

1、this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的;

2、当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,反之this指向方法前的对象(也就是说当出现 [对象].[函数名] 时,this指向是[对象])。

demo1:指向方法前的对象

  1. var obj = {
  2. x:20,
  3. f:function(){console.log(this.x);}
  4. };
  5.  
  6. obj.f(); //输出20,f()前有obj对象所以this指向obj
  7.  
  8. obj.innerobj = {
  9. x:30,
  10. f:function(){console.log(this.x);}
  11. }
  12.  
  13. obj.innerobj.f(); //输出30 注:此时当出现多个 . 时,要看最后函数前的 . 本例中为obj.innerobj.

demo2:指向全局对象

  1. /*example 2*/
  2. var x = 10;
  3. var obj = {
  4. x:20,
  5. f:function(){
  6. console.log(this.x);
  7. var foo = function(){
  8. console.log(this.x);
  9. }
  10. foo();
  11. }
  12. };
  13.  
  14. obj.f(); //输出20和10 在执行f函数中的foo()函数时,由于foo()前没有对象名,故默认为全局对象,输出10
  15.  
  16. /*example 3*/
  17. var x = 10;
  18. var obj = {
  19. x:20,
  20. f:function(){
  21. console.log(this.x);
  22. }
  23. };
  24.  
  25. obj.f(); //输出20
  26.  
  27. var fOut = obj.f;
  28. fOut(); //输出10 fOut()前没有对象名,所以默认为全局变量
  29.  
  30. var obj2 = {
  31. x:30,
  32. f:obj.f
  33. }
  34.  
  35. obj2.f(); //输出30 f()前对象时obj2,故this指向obj2

3、this指向利用call或apply所指派给this的对象

有时候我们需要人为的修改this指向,那么我们就需要用到call或者apply具体用法如下:

  1. (A对象).函数名.callB对象,参数1,参数2,参数3,......);//使用此方法函数this指向B对象(若B对象为空则指向全局对象)
  2.  
  3. (A对象).函数名.applyB对象,[参数1,参数2,参数3,......]);//使用此方法函数this指向B对象,且参数通过数组传递(若B对象为空则指向全局对象)

不多说看例子:

  1. /*example 4*/
  2. var obj = {
  3. x:20,
  4. f:function(){
  5. console.log(this.x);
  6. }
  7. };
  8.  
  9. var obj2 = {
  10. x:30
  11. };
  12.  
  13. obj.f.call(obj2); //输出30而不是obj中的20 因为使用了call();

4、this指向new所产生的新对象

即:当函数当做构造函数来使用时,函数内部的this则指向于new出的新对象。

  1. function Student(){
  2. this.name="Leon";
  3. this.sex = "male";
  4. this.age=20;
  5. };
  6.  
  7. var stu = new Student();
  8. console.log(stu.sex); //输出male Student()中this指向了stu 故赋值给new出的stu对象

5、callback函数内的this会指向于,调用放入该callback的函数的this所指向的对象

作用域链                                                                                     

JavaScript this 局部变量全局变量 作用域 作用域链 闭包的更多相关文章

  1. JavaScript高级内容笔记:原型链、继承、执行上下文、作用域链、闭包

    最近在系统的学习JS深层次内容,并稍微整理了一下,作为备忘和后期复习,这里分享给大家,希望对大家有所帮助.如有错误请留言指正,tks. 了解这些问题,我先一步步来看,先从稍微浅显内容说起,然后引出这些 ...

  2. JavaScript函数之作用域 / 作用链域 / 预解析

    关于作用域和作用链域的问题,很多文章讲的都很详细,本文属于摘录自己觉得对自己有价值的部分,留由后用,仅供参考,需要查看详细信息请点击我给出的原文链接查看原文件 做一个有爱的搬运工~~ -------- ...

  3. 作用域&作用域链和with,catch语句&闭包

    作用域(函数) 作用域:变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期; 在一些类C编程语言中花括号内的每一段代码都有各自的作用域,而且变量在声明它们的代码段外是不可见的,称之为块 ...

  4. 深入理解javascript中执行环境(作用域)与作用域链

    深入理解javascript中执行环境(作用域)与作用域链 相信很多初学者对与javascript中的执行环境与作用域链不能很好的理解,这里,我会按照自己的理解同大家一起分享. 一般情况下,我们把执行 ...

  5. js原型链闭包作用域链-Tom

    1.原型相当于Java.C++里面的父类,由封装公有属性及方法而产生,子类可以继承. 原型继承实现(函数的原型属性指向原型函数一个实例对象,函数的原型的构造函数指向函数本身) 1)eg:原型链 fun ...

  6. Javascript的那些硬骨头:作用域、回调、闭包、异步……

    终于到了神话破灭的时刻-- 这注定是一篇"自取其辱"的博客,飞哥,你们眼中的大神,Duang,这次脸朝下摔地上了. 故事得从这个求助开始:e.returnValue 报错:未定义, ...

  7. 作用域 作用域链 闭包 思想 JS/C++比较

    首先,我说的比较是指JS中这种思想/实现方式与C++编译原理中思想/实现方式的比较 参考链接:(比较易懂的介绍,我主要写个人理解) 作用域链: http://www.cnblogs.com/dolph ...

  8. 《你不知道的JavaScript》第一部分:作用域和闭包

    第1章 作用域是什么 抛出问题:程序中的变量存储在哪里?程序需要时,如何找到它们? 设计 作用域 的目的:为了更好地存储和访问变量. 作用域:根据名称查找变量的一套规则,用于确定在何处以及如何查找变量 ...

  9. JavaScript之作用域-作用域链

    作用域 ==> 作用域链   作用域:变量可以其作用的区域(声明定义好一个变量,变量可以在哪些范围内使用) 分类:全局作用域和局部作用域(函数作用域):在js中,目前全局有作用域以及函数可以形成 ...

随机推荐

  1. EL表达式取整

    <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%> 1. <fm ...

  2. Alert方法重写

    在正规项目中,总感觉alert框是非常难看的,但是有的时候又必须添加alert框来给用户一种警醒,废话不多说,先上图

  3. Python之路第二天,基础(2)-基本数据类型

    一.Python数据类型 数 在Python中有4种类型的数,整数,长整数,浮点数和复数. 2是一个整数的例子 长整数不过是大一点的整数 3.23和52.3E是浮点数的例子.E标记表示10的幂.52. ...

  4. GSoap的使用(调用webservice接口)

    由于本人写项目时使用到C++要调用C#写得后台服务器发布的webservice,因此抽出来了一点时间整理相关的知识如下 gSOAP是一个绑定SOAP/XML到C/C++语言的工具,使用它可以简单快速地 ...

  5. 微软企业库的Cache

    微软企业库的Cache 通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能.基于微软的企业库,我们的快速创建一个缓存的实现. 新建PrismSamp ...

  6. coredata中谓词的使用

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数.在cocoa ...

  7. .NET自动字符编码识别程序库 NChardet

    什么是NChardet NChardet是mozilla自动字符编码识别程序库chardet的.NET实现,它移植自jchardet,chardet的java版实现,可实现对给定字符流的编码探测. N ...

  8. QWidget: Must construct a QApplication before a QPaintDevice的问题

    卧槽,无意中编译自己基于Qt创建的Debug工程的时候运行时发生了标题中的错误,原来是把Qt Release的库也放到additional dependencies里面了,同时链接了Debug和Rel ...

  9. 【转】ubuntu下解压缩zip,tar,tar.gz和tar.bz2文件

    原文网址:http://blog.sina.com.cn/s/blog_5da93c8f0101h1uj.html 在Linux下面如何去压缩文件或者目录呢? 在这里我们将学习zip, tar, ta ...

  10. C++关于strcpy等函数的安全版本

    如下程序: #include <iostream> using namespace std; int main() { ]; strcpy(ch1,"); } 在VS2012上面 ...