this属性表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window;

如果在函数中使用this,则this指代什么是根据运行时此函数在什么对象上被调用。

我们还可以使用apply和call两个全局方法来改变函数中this的具体指向。

先看一个在全局作用范围内使用this的例子:

    1. < script type="text/javascript">
    2. console.log(this === window); // true
    3. console.log(window.alert === this.alert); // true
    4. console.log(this.parseInt("021", 10)); // 10
    5. < /script>

函数中的this属性是在运行时决定的,而不是函数定义时,如下:

    1. // 定义一个全局函数
    2. function foo() {
    3. console.log(this.fruit);
    4. }
    5.  
    6. // 定义一个全局变量,等价于window.fruit = "apple";
    7. var fruit = "apple";
    8.  
    9. // 此时函数foo中this指向window对象
    10. // 这种调用方式和window.foo();是完全等价的
    11. foo(); // "apple"
    12.  
    13. // 自定义一个对象,并将此对象的属性foo指向全局函数foo
    14. var pack = {
    15. fruit: "orange",
    16. foo: foo
    17. };
    18.  
    19. // 此时函数foo中this指向pack对象
    20. pack.foo(); // "orange"

全局函数apply和call可以用来改变函数中this属性的指向,如下:

    1. // 定义一个全局函数
    2. function foo() {
    3. console.log(this.fruit);
    4. }
    5.  
    6. // 定义一个全局变量
    7. var fruit = "apple";
    8.  
    9. // 自定义一个对象
    10. var pack = {
    11. fruit: "orange"
    12. };
    13.  
    14. // 等价于window.foo();
    15. foo.apply(window); // "apple"
    16.  
    17. // 此时foo中的this === pack
    18. foo.apply(pack); // "orange"

注:apply和call两个函数的作用相同,唯一的区别是两个函数的参数定义不同。

因为在JavaScript中函数也是对象,所以我们可以看到如下有趣的例子:

    1. // 定义一个全局函数
    2. function foo() {
    3. if (this === window) {
    4. console.log("this is window.");
    5. }
    6. }
    7.  
    8. // 函数foo也是对象,所以可以定义foo的属性boo为一个函数
    9. foo.boo = function() {
    10. if (this === foo) {
    11. console.log("this is foo.");
    12. } else if (this === window) {
    13. console.log("this is window.");
    14. }
    15. };
    16.  
    17. // 等价于window.foo();
    18. foo(); // this is window.
    19.  
    20. // 可以看到函数中this的指向调用函数的对象
    21. foo.boo(); // this is foo.
    22.  
    23. // 使用apply改变函数中this的指向
    24. foo.boo.apply(window); // this is window.(使用apply)

JavaScript对象中的this属性的更多相关文章

  1. JavaScript对象中的constructor属性

    constructor属性始终指向创建当前对象的构造函数. 比如下面的例子: // 等价于 var foo = new Array(1, 56, 34, 12); var arr = [1, 56, ...

  2. JavaScript对象中的属性(可写,可配置,可枚举,value,getter,setter)

    JavaScript中,对象包括3个特性,分别为,可扩展性,class标识符,属性. 如果对象的可扩展性为false,则不可为对象动态的添加属性.   对象包含分为存取器属性和值属性.存取属性为 {g ...

  3. JavaScript的事件对象中的特殊属性和方法(鼠标,键盘)

    鼠标操作导致的事件对象中的特殊属性和方法 鼠标事件是 Web 上面最常用的一类事件,毕竟鼠标还是最主要的定位设备.那么通过事件对象可以获取到鼠标按钮信息和屏幕坐标获取等 鼠标按钮 只有在主鼠标按钮被单 ...

  4. js对象中动态读取属性值 动态属性值 js正则表达式全局替换

    $(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...

  5. [记录] javascript 对象中使用setTimeout

    参考:Javascript对象中关于setTimeout和setInterval的this介绍 使用最后一个方法终于弄好了,简直了,在对象中使用setTimeout原来是这样的 做的是分钟倒计时,倒数 ...

  6. 在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be closed first”

    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be ...

  7. 删除JavaScript对象中的元素

    参考http://stackoverflow.com/questions/208105/how-to-remove-a-property-from-a-javascript-object 通过dojo ...

  8. Javascript 对象的创建和属性的判定

    1. 创建对象的方法: 直接使用new 对Object对象进行操作,即对Object 对象进行实例化 <!DOCTYPE html> <html lang="en" ...

  9. Stream流用于按照对象中某一属性来对集合去重+简单数据类型集合的去重

    上次对Stream流来进行分组的文章很多人看,想看的可以来这: Stream流来进行集合分组 这次小编又带来Stream的去重,话不多数,直接上代码: 这是对简单数据类型的去重 //字符串集合进行简单 ...

随机推荐

  1. [Objective-C语言教程]决策结构(10)

    决策结构要求程序员指定一个或多个要由程序评估或测试的条件,以及在条件被确定为真时要执行的一个或多个语句,以及可选的,如果条件要执行的其他语句 被认定是假的. 以下是大多数编程语言中的典型决策结构的一般 ...

  2. <转>jmeter JDBC Request之Query Type

    本博客转载自:http://www.cnblogs.com/imyalost/category/846346.html 个人感觉不错,对jmeter讲解非常详细,担心以后找不到了,所以转发出来,留着慢 ...

  3. POJO和Javabean的区别:

    pojo:存粹java类,不继承,不实现.(不受限制的java类),多用于指数据库的映射对象javaBean:可复用组件,由容器(tomcat)创建,因此应具有无参构造器,不能跨进程访问,通常要无方法 ...

  4. linux源码中的核心数据结构

    寄存器 pt_regs 进程线程 struct task_struct: 进程,或者是线程数据结构,在include/linux/sched.h里面定义的,与硬件体系结构无关 struct threa ...

  5. SQL语句之数据库操作

    SQL语句系列 1.SQL语句之行操作 2.SQL语句之表操作 3.SQL语句之数据库操作 4.SQL语句之用户管理 占坑,带写……

  6. java--浅谈线程

    一.线程基础: 1.CPU核心数和线程数的关系 线程数:是同一时刻设备能并行执行的程序个数,线程数=cpu个数 * 核数,及程数=cpu个数(2) * 核数(2)=4: 使用了超线程技术后---> ...

  7. MySQL保留字冲突 关键词:保留字, 关键字

    在Mysql中,当表名或字段名乃至数据库名和保留字冲突时,在sql语句里可以用撇号`(Tab键上方的按键)括起来. 注意,只有保留字需要``括起来,非保留字的关键字不需要. MySQL 8.0 官方文 ...

  8. eclipse 远程debug

    [环境参数] Eclipse:Version: Mars.2 Release (4.5.2) Linux:centOS 6.5 [简述] Java自身支持调试功能,并提供了一个简单的调试工具--JDB ...

  9. window.load方法 (加载全部图片,第三方网站时使用)

    $(window).load(  function(){                                                              console.lo ...

  10. [总]Android高级进阶之路

    个人Android高级进阶之路,目前按照这个目录执行,执行完毕再做扩展!!!!! 一.View的绘制 1)setContentView()的源码分析 2)SnackBar的源码分析 3)利用decor ...