(O)js核心:this
什么是this
this是js中的一个关键词,它总是指向一个对象,而具体指向哪个对象是在运行时基于函数的执行环境动态绑定的,而非函数被声明时的环境。
当函数被调用时,this被添加到作用域中,例如:
function add(num1,num2) {
var sum = num1 + num2;
return sum;
}
var total = add(5,10);
add的作用域链如下图所示,我们可以看到作用域链中的两个this(一个全局作用域中的this和add作用域中的this,后面我们将明白为何两个this都指向window):

this的指向
this总是指向所属函数的拥有者对象,具体分为3种情况
1.作为对象的方法调用: 当函数作为对象的方法被调用时,this指向该对象。
var obj={
a:1,
getA:function(){
alert(this===obj);
alert(this.a);
}
};
obj.getA(); //分别输出ture和1
2.作为普通函数调用: 当函数不作为对象的属性被调用时,也就是我们常说的普通函数方式,此时的this总是指向全局对象。
window.name='jacksplwxy';
var getName=function(){
return this.name;
};
console.log(getName()); //输出jacksplwxy
3.构造器调用: 当用new调用构造函数时,该构造函数会返回一个对象,一般情况下,this就会指向这个返回对象。
var myClass=function(){
this.name='jacksplwxy';
};
var obj=new myClass();
console.log(obj.name); //输出:jacksplwxy
this实战
技巧:this总是指向所属函数的拥有者对象
//实战1:
var obj={
myName:'jacksplwxy',
getName:function(){
return this.myName;
}
};
console.log(obj.getName()); //输出: jacksplwxy var getName2=obj.getName;
console.log(getName2()); //输出:undefined /*解析:
当调用obj.getName时,getName方法作为obj对象的属性被调用的,根据this指向情形1规律,此时this
指向obj对象,所示输出jacksplwxy。
当用另外一个变量getName2来引用obj.getName,并调用getName2时,根据this指向情形2规律,此时是
普通函数调用方式,this是指向全局window的。所以输出undefined。*/
//实战2:
var foo = "window";
var obj = {
foo : "obj",
getFoo : function(){
return function(){
return this.foo;
};
}
};
var f = obj.getFoo();
f(); //window /*解析:
执行var f = obj.getFoo()返回的是一个匿名函数,相当于:
var f = function(){
return this.foo;
}
f()相当于window.f(), 因此f中的this指向的是window对象,this.foo相当于window.foo, 所以f()返回"window"
*/
//实战3:
var foo = "window";
var obj = {
foo : "obj",
getFoo : function(){
var that = this;
return function(){
return that.foo;
};
}
};
var f = obj.getFoo();
f(); //obj /*解析:
执行var f = obj.getFoo() 同样返回匿名函数,即:
var f = function(){
return that.foo;
}
唯一不同的是f中的this变成了that, 要知道that是哪个对象之前,先确定f的作用域链:f->getFoo->window 并在该链条上查找that,此时可以发现that指代的是getFoo中的this, getFoo中的this指向其运行时的调用者,从var f = obj.getFoo() 可知此时this指向的是obj对象,因此that.foo 就相当于obj.foo,所以f()返回"obj"
*/
转载请注明文章出处:http://www.cnblogs.com/jacksplwxy/p/6701874.html
(O)js核心:this的更多相关文章
- JS核心
JS核心 1.实例化对象 objectName = new objectType (param1 [,param2] ...[,paramN]) 参数 objectName 新对象实例的名称. ob ...
- Node.js核心入门
前言: 因为以前学习Node.js并没有真正意义上的去学习它,而是粗略的学习了npm的常用命令和Node.js一些模块化的语法,因此昨天花了一天的时间看了<Node.js开发指南>一书.通 ...
- JS核心系列:浅谈原型对象和原型链
在Javascript中,万物皆对象,但对象也有区别,大致可以分为两类,即:普通对象(Object)和函数对象(Function). 一般而言,通过new Function产生的对象是函数对象,其他对 ...
- JS核心系列:浅谈 call apply 与 bind
在JavaScript 中,call.apply 和 bind 是 Function 对象自带的三个方法,这三个方法的主要作用是改变函数中的 this 指向,从而可以达到`接花移木`的效果.本文将对这 ...
- node.js核心模块
全局对象 global 是全局变量的宿主 全局变量 在最外层定义的 全局对象的属性 隐士定义的变量(未定义直接赋值的变量) 当定义一个全局变量时 这个变量同时也会成为全局对象的属性 反之亦然 注意: ...
- JS核心笔记
一.说明 JS权威指南文字用红色标出: JS高级程序设计用橙色标出; 自己加上的文字用粉红色标出: 其(一)-(九)为JS权指南,(十)为JS高级程序设计 二.记法结构 2.1字符集 Javascri ...
- vue.js核心最基本的功能
Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: , text: , text: , text: '随便其它什么人吃的东西' } ] }}) 蔬菜 奶酪 随便其 ...
- Ext.Js核心函数( 三)
ExtJs 核心函数简介 1.ExtJs提供的常用函数2.get.fly.getCmp.getDom.getBody.getDoc3.query函数和select函数4.encode函数和decode ...
- node.js 核心http模块,起一个服务器,返回一个页面
let http=require("http"); //引入核心http模块 let fs=require("fs"); let mime={ '.js':'a ...
- JS核心之DOM操作 下
目录: 1.节点类型之Document类型 2.节点类型之Element类型 3.节点类型之Text类型 4.综合小示例 -- 动态添加外部样式文件 5.查找元素的扩展方法 接上篇,我们先来看常用的三 ...
随机推荐
- Kubernetes1.9 二进制版集群+ipvs+coredns
节点构造如下 : 节点ip 节点角色 hostname 192.168.0.57 node bigdata3 192.168.0.56 node bigdata4 192.16 ...
- Electrom will-download pause function
1.code from github url-link: https://github.com/electron/electron/issues/7712 // to store downloadIt ...
- Structured streaming
Structured streaming是spark 2.0以后新增的用于实时处理的技术.与spark streaming不同的是,Structured streaming打开了数据源到数据落地之间的 ...
- oracle 的查询问题!!!
问题: declare aaa integer;email varchar2(100) :='1234@aa.com';begin select count(*) into aaa from dual ...
- Neumann's Principle and Curie laws
Neumann's Principle Neumann's principle, or principle of symmetry, states that, if a crystal is inva ...
- matomo 开源网站分析平台
1.安装PHP https://www.jianshu.com/p/8d54a401ec06 yum remove php* yum -y install epel-release rpm -Uvh ...
- 2019年华南理工大学程序设计竞赛(春季赛)-H-Parco_Love_GCD
题目链接:https://ac.nowcoder.com/acm/contest/625/H 题意:给定n个数(<=1e9)的序列,其中n<=5e5,求该序列所有子序列的对应的gcd对1e ...
- openstack 相关服务常用命令整理
1. 数据库: # systemctl start mysqld # systemctl enable mysqld # systemctl status mysqld #mysql> show ...
- VIM常见命令
1.删除所有数据 进入到第1行按下d,然后输入G回车,此时内容被全部清除 2.替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky:s/vivian/sky/g 替换当前行所 ...
- websocket搭建错误
用一下版本: gevent == 1.2.2 Eel == 0.9.7 gevent-websocket == 0.10.1 greenlet == 0.4.13 PyInstaller == 3.3 ...