1、全局代码中的this:始终指向window

2、函数代码中的this:

var foo = {x: 10};
var bar = {x: 20,test: function () {alert(this === bar);alert(this.x);}
};
bar.test(); //bar对象调用test(): true, 20
foo.test = bar.test;
foo.test(); //foo对象调用test(): false, 10

  在通常的函数调用中,this是由激活上下文代码的调用者来提供的,即调用函数的父上下文(parent context )。this取决于调用函数的方式

  即使是正常的全局函数也会被调用方式的不同形式激活,这些不同的调用方式导致了不同的this值。

function foo() {alert(this);
}
foo(); // window
alert(foo === foo.prototype.constructor); // true
// 但是同一个function的不同的调用表达式,this是不同的
foo.prototype.constructor(); // foo.prototype

var foo = {bar: function () {alert(this);alert(this === foo);}
};
foo.bar(); //foo、true
var exampleFunc = foo.bar;
alert(exampleFunc === foo.bar); //纯函数比较,是true
// 再一次,同一个function的不同的调用表达式,this是不同的
exampleFunc();//window、false

引用类型

  引用类型的值与函数上下文中的this值如何相关?——从最重要的意义上来说。 这个关联的过程是这篇文章的核心。 一个函数上下文中确定this值的通用规则如下:

  在一个函数上下文中,this由调用者提供,由调用函数的方式来决定。如果调用括号()的左边是引用类型的值,this将设为引用类型值的base对象(base object),在其他情况下(与引用类型不同的任何其它属性),这个值为null。不过,实际不存在this的值为null的情况,因为当this的值为null的时候,其值会被隐式转换为全局对象。

var foo = {bar: function () {alert(this);}
};
foo.bar(); //foo
(foo.bar)(); //foo
(foo.bar = foo.bar)(); //window
(false || foo.bar)(); //window
(foo.bar, foo.bar)(); //window

  第二个例子:在组运算的返回中,我们得到仍是一个引用类型 foo.bar 。这就是this值为什么再次设为base对象,即foo。与下面这例子区别:

(function () {alert(this);})();//()左边不是引用类型,所以是window,实际上在字面上完全等价于(foo.bar)(),但this指向就是不同,这就是核心区别。

  第三、四、五例经过组运算后,得到的都不是引用类型,所以是window。

3、作为构造器调用的函数中的this:

function A() {alert(this); // 新创建的对象new Athis.x = 10;
}
var a = new A();

  在这个例子中,new运算符调用“A”函数的内部的[[Construct]] 方法,接着,在对象创建后,调用内部的[[Call]] 方法。 所有相同的函数“A”都将this的值设置为新创建的对象。

4、手动设置函数的this值

  在函数原型中定义的两个方法(因此所有的函数都可以访问它)允许去手动设置函数调用的this值。它们是.apply和.call方法。他们用接受的第一个参数作为this值,this 在调用的作用域中使用。这两个方法的区别很小,对于.apply,第二个参数必须是数组(或者是类似数组的对象,如arguments,反过来,.call能接受任何参数。两个方法必须的参数是第一个——this。

var b = 10;
function a(c) {alert(this.b);alert(c);
}
a(20); //10、20
a.call({b: 20}, 30); //20、30
a.apply({b: 30}, [40]);//30、40

理解JavaScript里this关键字相关推荐

  1. 深入理解Javascript之this关键字

    http://www.laruence.com/2009/09/08/1076.html 08 Sep 09 深入理解Javascript之this关键字 作者: Laruence(   ) 本文地址 ...

  2. JavaScript中this关键字使用方法详解

    在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...

  3. javascript笔记:深入分析javascript里对象的创建(上)续篇

    今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...

  4. 深入理解JavaScript系列(4):立即调用的函数表达式

    前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下"自执行"这个叫法,本文对这个功能的叫 ...

  5. js调用php函数兵每秒刷新,深入理解JavaScript立即调用函数表达式(IIFE)

    立即调用函数 目录一.了解立即调用函数表达式 二.立即调用函数表达式报错了? 三.使用立即调用函数的正确姿势 四.常见使用场景 写在最后 一.了解立即调用函数表达式 1.1 思维导图 1.2 什么是立 ...

  6. 深入理解JavaScript的闭包特性如何给循环中的对象添加事件

    初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...

  7. 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现

    http://www.cnblogs.com/TomXu/archive/2012/02/06/2330609.html 介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概 ...

  8. java script创建对象_javascript笔记:深入分析javascript里对象的创建

    大家知道在java里面类可以具有静态属性和方法,无需实例化该类的对象,就可以访问这些属性和方法,但是javascript里面是不是只有通过对象初始化方式才会模拟出这样的特点了?其实不然,在编程语言里, ...

  9. 深入理解JavaScript系列:This? Yes,this!

    介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题. 许多程序员习惯的认为,在程序语言中 ...

最新文章

  1. Python List append()方法
  2. Bzoj2110--Wc2011Xor
  3. MSF常用的监听模块命令
  4. c++矩阵类_面向对象有限元编程|单元类
  5. linux常用文件操作命令
  6. HttpModule和HttpHandler的常见用法
  7. 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-11层驱动之FSMC
  8. JavaScript怎样读取本地Excel文件
  9. (简单实用小技巧)在浏览器如何打开php文件
  10. 井字游戏 Tic Tac Toe
  11. 连接服务器切换无线,怎么用路由器连接别人的wifi?
  12. linux v4l2色调,V4L2下摄像头的详细参数调整
  13. Java8新特性之Stream流式编程
  14. qt 计算字符串宽度高度
  15. chrome浏览器安装插件显示程序包无效
  16. c语言 signal作用,C语言中的signal函数
  17. vue判断是Android还是ios手机
  18. 十四.Deepin Linux V20.7 插入耳机听不到声音的解决办法
  19. 微信公众号开发(一) -- 自定义菜单 动态菜单
  20. 贝叶斯滤波算法(实例)

热门文章

  1. HTML中添加meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1
  2. github.com/oschwald/maxminddb-golang 安装报错
  3. 244. Shortest Word Distance II
  4. DSAPI多功能组件编程应用-HTTP监听服务端与客户端
  5. 管理数据通用权限系统快速开发框架设计
  6. Zookeeper集群安装Version3.5.1
  7. Kafka集群安装Version2.10
  8. Java零基础入门 : (2) 代码编辑器IDEA安装与配置
  9. android支付平台,android移动支付
  10. metasploit渗透测试指南_Metasploit渗透测试环境搭建与使用