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);
};
}

最新文章

  1. add user and grant privileges on mariadb
  2. hadoop安装
  3. 关于ajax的提交未完再续!
  4. 学习Linux入门50个基本命令
  5. input 标签的监听事件总结
  6. 非刚性图像配准 matlab简单示例 demons算法
  7. WIFI无线adb调试android
  8. Android Studio集成Flutter
  9. Python之find命令中的位置的算法
  10. 浅谈HTTP中GET、POST用法以及它们的区别
  11. C++学习5-面向对象编程基础(构造函数、转换构造、静态数据成员、静态成员函数、友元)
  12. Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境
  13. 公告:《那些年,追寻Jmeter的足迹》上线
  14. python3反射
  15. java关于类加载的面试题
  16. 【算法笔记】A1039 Course List for Student
  17. BZOJ4896 THUSC2016补退选(trie)
  18. sed正则
  19. arm-linux工具
  20. redhat 9.0安装完不能上网解决办法(补) - 并附上redhat9.0 下载链接

热门文章

  1. Silverlight & Blend动画设计系列十一:沿路径动画(Animation Along a Path)
  2. springboot+mybatis+thymeleaf+docker构建的个人站点开源项目(集成了个人主页、个人作品、个人博客)
  3. Gradle sync failed: Cause: org.gradle.logging.StyledTextOutput$Style Consult IDE log for more details
  4. Window 10 安装 MySQL
  5. jmeter简单使用示例
  6. Android xmlns 的作用及其自定义
  7. Can't read stdin: end of file found
  8. 关于div设置display: inline-block之后盒子之间间距的处理
  9. "UTF-8"、"UTF8"、"utf-8"、"utf8"之间的区别
  10. canvas合成图片 圣诞节新技能戴帽