对JavaScript中this的理解
JavaScript中的this其实没传说中的那么难,也没那么乱。
我们来分析下,this主要是跟它的执行环境有关。
而通常情况下,this都是放在函数体中或可执行的JS代码中(函数体除外)。
至于JS可执行代码中的this,用的不多,所以本文举例较少。
至于函数体中的this,我们只要弄清楚this所处的函数体是谁在调用,不就知道this是谁了吗?
注意:此文中的函数调用,是指该函数作为某对象的一个属性方法被执行,而不是单纯的在某个对象的作用域中执行就是调用
-------------------------------------------------------------------------------------------------------------
NO.1可执行代码中的this(包含在函数体中的this除外)
1. 全局代码中的this
alert(this)//window
2. HTML事件处理程序中的this
<input type="button" name="click" id="click" value="clicked" onclick="console.log(this)" />
<!--
输出结果:<input type="button" name="click" id="click" value="clicked" onclick="console.log(this)">
-->
NO.2 若this所在的函数体没有被对象调用,则this指向window(默认调用对象是window)。无论这个函数在哪,也无论这个函数体嵌套了多少层。
示例:
//第一层
function test1(){
console.log(this); //window
//第二层
function test2(){
console.log(this); //window
//第三层
function test3(){
console.log(this); //window
//第四层
function test4(){
console.log(this); //window
}
test4();
}
test3();
}
test2();
}
test1();
分类举例:
1. 作为单纯的函数调用
function test(){
console.log(this); //window
}
test();
2. 作为构造函数
function person(name){
this.name = name;
this.type = "person";
this.eat = function(){
alert("eat");
}; console.log(this);
}
person(); // window
var person1 = new person("wlh"); //person1
函数内部的this指向新构建的对象,若没有,指向 window。
其实跟单纯的函数调用是一样的,只是有个一个高逼格的名称(构造函数)。(理解构造函数和普通函数的区别!)
3、对象函数
var name = "clever coder";
var person = {
name : "foocoder",
hello : function(sth){
console.log(this.name + " says " + sth);
}
}
person.hello("hello world"); // foocoder says hello world
this指向person对象,即当前对象。
此处的hello作为person的属性方法被执行,所以它的this指向了person
4、内部函数
var name = "clever coder";
var person = {
name : "foocoder",
hello : function(sth){
function sayhello(sth) {
console.log(this.name + " says " + sth);
};
sayhello(sth);
}
}
person.hello("hello world");//clever coder says hello world
在这个内部函数中,sayhello函数只是在person.hello的函数体内被执行。
但它并没有作为当前对象的属性方法被执行。所以这个内部函数仍然是属于没有对象调用,只是执行了。所以它内部的this指向 window
等弄清楚了this的指向问题,再来看call()、apply()、bind()改变后的this指向,不也是很明朗吗?
这三个函数只是单一的改变当前函数的this指向,不影响其他地方
-------------------------------------------------------------------------------------------------------------
测试看是否完全理解了
练习一,
var age = 19;
function person(){
var age = 20;
this.age = 21;
} console.log(age);
person();
console.log(age);
结果:
var age = 19;
function person(){
var age = 20;
// 若没有明确的调用对象(默认window调用),则此处的this相当于window,执行person()后,覆盖了全局变量age
this.age = 21;
} console.log(age); //
person();
console.log(age); //
练习二:
var person = {
age:19
} function person1(){
var age = 20;
this.age = 21; function person2(){
var age = 22;
this.age = 23;
}
person2(); }
console.log(person.age);
person1.call(person);
console.log(person.age); console.log(age);
结果:
var person = {
age:19
} function person1(){
var age = 20;
this.age = 21; function person2(){
var age = 22;
this.age = 23;
}
person2(); } //调用的是person对象的age属性的值
console.log(person.age); //
//执行person1,并利用call将person1中的this指向person对象。所以 this.age = person.age = 21
person1.call(person);
console.log(person.age); //
//这个跟'练习一'一样,若没有明确指出调用对象,则this指向window
console.log(age); //
本文算是从另一个角度去重新理解了JavaScript中的this
这是之前转载博客:详解JavaScript中的this ,
对JavaScript中this的理解的更多相关文章
- JavaScript中的闭包理解
原创文章,转载请注明:JavaScript中的闭包理解 By Lucio.Yang 1.JavaScript闭包 在小学期开发项目的时候,用node.js开发了服务器,过程中遇到了node.js的第 ...
- javascript中 (function(){})();如何理解?
javascript中 (function(){})();如何理解? javascript中: (function(){})()是匿名函数,主要利用函数内的变量作用域,避免产生全局变量,影响整体页面环 ...
- 关于javascript中闭包的理解
闭包就是能够读取其他函数内部变量的函数. 在javascript中,只有函数内部的子函数可以读取局部变量,因此,我理解闭包就是定义在一个函数内部的函数. 例子: var f1 = function() ...
- 对JavaScript中闭包的理解
在前端开发中闭包是一个很重要的知识点,是面试中一定会被问到的内容.之前我对闭包的理解主要是"通过闭包可以在函数外部能访问到函数内部的变量",对闭包运用的也很少,甚至自己写过闭包自己 ...
- 转:对JavaScript中闭包的理解
关于 const let var 总结: 建议使用 let ,而不使用var,如果要声明常量,则用const. ES6(ES2015)出现之前,JavaScript中声明变量只有 ...
- JavaScript 中this 初步理解笔记
Javascript中函数中的this通常指向的是函数的拥有者,这个拥有者就是上下文执行对象:另外一点需要注意,this只能在javascript函数内部使用.
- javascript中的原型理解总结
经过几天研究查找资料,对原型终于有点理解了,今天就做下总结,不对之处,希望各位能够提出. 1.每一个Javascript对象(null除外)都和另一个对象相关联,“另一个”对象就是我们今天所要总结的原 ...
- javascript 中{}和[] 的理解
下面的一段解释是摘抄的,基本理解正确,做个记录.其实js中数组其实就是对象,typeof(['a', 'b', 'c'])//测试之后结果为 : "object" 一.{ } 大 ...
- 第二话:javascript中闭包的理解
闭包是什么? 通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行. OK,我来简单叙述下,先上图. 都知道函数是javascript整个世界,对象是函数,方法是函数,并且js中实质性的 ...
随机推荐
- WINDOWS动态链接库--MFC规则动态链接库
第一代window程序员使用windows api进行编程,到了后来,微软推出MFC类库,于是,动态链接库进行了升级,可以在动态连接库中使用MFC的API,这就叫做MFC动态链接库, 其中MFC动态链 ...
- Spring MVC 关于分页的简单实现
据本人了解,目前较常用的分页实现办法有两种: 1.每次翻页都修改SQL,向SQL传入相关参数去数据库实时查出该页的数据并显示. 2.查出数据库某张表的全部数据,再通过在业务逻辑里面进行处理去取得某些数 ...
- JAVA判断32位还是64位,调用不同的DLL(转)
源:JAVA判断32位还是64位,调用不同的DLL 通过获取sun.arch.data.model可判断是32还是64的JAVA 将32或者64位的DLL放不同的目录,实现自适应调用DLL Prope ...
- html小知识
button标签如果不设置type,默认是submit,会自动提交表单 input type=file, 添加multiple属性后可以同时选择多个文件,同时name设置接受一个数组 <inpu ...
- angular登录状态检查
待补充!!!!!!!!!!! 参加链接: http://www.brafox.com/post/2015/javascript/angularjs/angularjs-router-intercept ...
- ndk-stack 调试 android c++ 代码崩溃位置
在android下面使用jni来调用c++,在开发游戏是非常正常的.但是要调试c++部分却是非常麻烦的问题.如果快速定位崩溃位置呢.NDK提供了一个小工具ndk-stack. 首先,我们先配置环境,把 ...
- CSS实现导航条Tab切换的三种方法
前面的话 导航条Tab在页面中非常常见,本文说详细介绍CSS实现导航条Tab的三种方法 布局 根据上图所示,先规定几个定义,上图的模块整体叫做导航,由导航标题和导航内容组成.要实现上图所示的布 ...
- redhat在线安装chrome浏览器
开始的时候是参考吹尽黄沙始到金的文章http://www.cnblogs.com/effective/archive/2012/03/18/2405189.html 1.创建一个文件/etc/yum. ...
- My first essay
今天是我开通博客第一天,从此开始了我的博客之路.为了实现成为程序猿的我,现在开始努力啦~今年大三,就读杭州电子科技大学,通信工程专业.现在在自学web前端,虽然与我就读专业并无多大相关,但是这是根据自 ...
- asp.net 二级域名session共享
1.自定义类 namespace SessionShare{ public class CrossDomainCookie : IHttpModule { private string m_RootD ...