理解JavaScript的this对象
1.概述
this对象是在运行时基于函数的执行环境绑定的,this总是返回一个对象,简单说,就是返回属性或方法“当前”所在的对象。在全局函数中,this等于window,而当函数作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window(如果通过call()或者apply()改变函数执行环境的情况下,this会指向其他对象。)。
2.为什么使用this?
虽然知道了this是怎么回事了,但是为什么要使用this,或者说this它带来了那些好处了。
因为在实例化对象时,总是不能确定开发者会使用什么样的变量名。使用 this,即可在任何多个地方重用同一个函数。请思考下面的例子:
function showColor() {
alert(this.color);
};
var oCar1 = new Object;
oCar1.color = "red";
oCar1.showColor = showColor;
var oCar2 = new Object;
oCar2.color = "blue";
oCar2.showColor = showColor;
oCar1.showColor(); //输出 "red"
oCar2.showColor(); //输出 "blue"
3.下面来看使用this的一些情况
示例一
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()()); //"The Window"
上面代码先创建了一个全局变量name,又创建了一个包含name属性的对象。这个对象还包含一个方法-getNameFunc(),它返回一个匿名函数,而这个匿名函数又返回this.name。由于getNameFunc()返回一个函数因此调用object.getNameFunc()()就会立即调用它的返回的函数,最后返回了全局name变量的值The Window。为什么没有返回My Object?
解释:每个函数在调用的时候,其活动对象都回自动取得两个变量:this和arguments。而调用object.getNameFunc()()返回的匿名函数是在全局环境中执行的,所以它的this指向就是window了。
那么如果要调用外部的this,有什么办法呢?通过把外部作用域中的this对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了,如下所示。
示例二
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()()); //"MyObject"
这个例子与上面的例子区别是,在定义匿名函数之前,我们把this对象赋值给了一个名叫that的变量,从而使得this的值得到了固定。而定义了闭包,通过作用域链就能访问到that了。
示例三
function sayColor(color){
this.color=color;
alert(this.color);
}
function ClassB(sColor, sName) {
sayColor.call(this, sColor);//this是指classB的实例对象,将sayColor函数作为classB的实例对象方法调用,并传入了sColor参数。
// sayColor.apply(this, arguments);
this.name = sName;
this.sayName = function () {
alert(this.name);
};
}
最新文章
- add user and grant privileges on mariadb
- hadoop安装
- 关于ajax的提交未完再续!
- 学习Linux入门50个基本命令
- input 标签的监听事件总结
- 非刚性图像配准 matlab简单示例 demons算法
- WIFI无线adb调试android
- Android Studio集成Flutter
- Python之find命令中的位置的算法
- 浅谈HTTP中GET、POST用法以及它们的区别
- C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
- Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
- 公告:《那些年,追寻Jmeter的足迹》上线
- python3反射
- java关于类加载的面试题
- 【算法笔记】A1039 Course List for Student
- BZOJ4896 THUSC2016补退选(trie)
- sed正则
- arm-linux工具
- redhat 9.0安装完不能上网解决办法(补) - 并附上redhat9.0 下载链接
热门文章
- Silverlight &; Blend动画设计系列十一:沿路径动画(Animation Along a Path)
- springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客)
- Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details
- Window 10 安装 MySQL
- jmeter简单使用示例
- Android xmlns 的作用及其自定义
- Can't read stdin: end of file found
- 关于div设置display: inline-block之后盒子之间间距的处理
- ";UTF-8";、";UTF8";、";utf-8";、";utf8";之间的区别
- canvas合成图片 圣诞节新技能戴帽