理解JavaScript里this关键字
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关键字相关推荐
- 深入理解Javascript之this关键字
http://www.laruence.com/2009/09/08/1076.html 08 Sep 09 深入理解Javascript之this关键字 作者: Laruence( ) 本文地址 ...
- JavaScript中this关键字使用方法详解
在面向对象编程语言中,对于this关键字我们是非常熟悉的.比如C++.C#和Java等都提供了这个关键字,虽然在开始学习的时候觉得比较难,但只要理解了,用起来是非常方便和意义确定的.JavaScrip ...
- javascript笔记:深入分析javascript里对象的创建(上)续篇
今天回来一看我的博客居然有这么多人推荐真是开心极了,看来大家对我的研究有了认可,写博客的动力越来越大了,而且我发现写javascript在博客园里比较受欢迎,写java的受众似乎少多了,可能博客园里j ...
- 深入理解JavaScript系列(4):立即调用的函数表达式
前言 大家学JavaScript的时候,经常遇到自执行匿名函数的代码,今天我们主要就来想想说一下自执行. 在详细了解这个之前,我们来谈了解一下"自执行"这个叫法,本文对这个功能的叫 ...
- js调用php函数兵每秒刷新,深入理解JavaScript立即调用函数表达式(IIFE)
立即调用函数 目录一.了解立即调用函数表达式 二.立即调用函数表达式报错了? 三.使用立即调用函数的正确姿势 四.常见使用场景 写在最后 一.了解立即调用函数表达式 1.1 思维导图 1.2 什么是立 ...
- 深入理解JavaScript的闭包特性如何给循环中的对象添加事件
初学者经常碰到的,即获取HTML元素集合,循环给元素添加事件.在事件响应函数中(event handler)获取对应的索引.但每次获取的都是最后一次循环的索引.原因是初学者并未理解JavaScript ...
- 深入理解JavaScript系列(18):面向对象编程之ECMAScript实现
http://www.cnblogs.com/TomXu/archive/2012/02/06/2330609.html 介绍 本章是关于ECMAScript面向对象实现的第2篇,第1篇我们讨论的是概 ...
- java script创建对象_javascript笔记:深入分析javascript里对象的创建
大家知道在java里面类可以具有静态属性和方法,无需实例化该类的对象,就可以访问这些属性和方法,但是javascript里面是不是只有通过对象初始化方式才会模拟出这样的特点了?其实不然,在编程语言里, ...
- 深入理解JavaScript系列:This? Yes,this!
介绍 在这篇文章里,我们将讨论跟执行上下文直接相关的更多细节.讨论的主题就是this关键字.实践证明,这个主题很难,在不同执行上下文中this的确定经常会发生问题. 许多程序员习惯的认为,在程序语言中 ...
最新文章
- Python List append()方法
- Bzoj2110--Wc2011Xor
- MSF常用的监听模块命令
- c++矩阵类_面向对象有限元编程|单元类
- linux常用文件操作命令
- HttpModule和HttpHandler的常见用法
- 【30集iCore3_ADP出厂源代码(ARM部分)讲解视频】30-11层驱动之FSMC
- JavaScript怎样读取本地Excel文件
- (简单实用小技巧)在浏览器如何打开php文件
- 井字游戏 Tic Tac Toe
- 连接服务器切换无线,怎么用路由器连接别人的wifi?
- linux v4l2色调,V4L2下摄像头的详细参数调整
- Java8新特性之Stream流式编程
- qt 计算字符串宽度高度
- chrome浏览器安装插件显示程序包无效
- c语言 signal作用,C语言中的signal函数
- vue判断是Android还是ios手机
- 十四.Deepin Linux V20.7 插入耳机听不到声音的解决办法
- 微信公众号开发(一) -- 自定义菜单 动态菜单
- 贝叶斯滤波算法(实例)
热门文章
- HTML中添加meta http-equiv=X-UA-Compatible content=IE=edge,chrome=1
- github.com/oschwald/maxminddb-golang 安装报错
- 244. Shortest Word Distance II
- DSAPI多功能组件编程应用-HTTP监听服务端与客户端
- 管理数据通用权限系统快速开发框架设计
- Zookeeper集群安装Version3.5.1
- Kafka集群安装Version2.10
- Java零基础入门 : (2) 代码编辑器IDEA安装与配置
- android支付平台,android移动支付
- metasploit渗透测试指南_Metasploit渗透测试环境搭建与使用