欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

javascript中this关键字的详细意思解释

来源:本站整理 作者:佚名 时间:2016-12-16 TAG: 我要投稿

不管学习什么知识,习惯于把自己所学习的知识列成一个list,会有助于我们理清思路,是一个很好的学习方法。强烈推荐。
以下篇幅有点长,希望读者耐心阅读。
以下内容会分为如下部分:
1.涵义
1.1:this涵义
1.2:this指向的可变性
2.使用场合
2.1:全局环境
2.2:构造函数
2.3:对象的方法
3.使用注意点
3.1:避免多层嵌套this
3.2:避免数组处理方法中的this
3.3:避免回调函数中的this
1.涵义
1.1:this涵义
在我写的一篇关于 构造函数与new关键字 的关系的博文中谈及,new关键字总是会返回一个对象。这个对象可以是new调用构造函数时返回的空对象,也可以是在构造函数中使用return语句返回的复杂数据类型(包括对象,数组等)。
同样,与new关键字相同,this关键字总是返回一个对象。再说的详细一些,就是属性或方法“当前”所在的对象。
var Keith = {
 firstName: 'Chou',
 describe: function() {
  return this.firstName;
 }
 };
console.log(Keith.describe()); //'Chou'
上面代码中,this.firstName表示describe方法当前所在对象的firstName属性。也就是说,在全局作用域下调用describe方法时,describe方法所在的当前对象是Keith,所以就是调用Keith.firstName。
1.2:this指向的可变性
由于对象的属性可以赋给另外一个对象,所以属性所在的当前对象是可变的。也就是说,this的指向是可变的。
var Keith = {
 firstName: 'Chou',
 describe: function() {
  return this.firstName;
 }
 };
 var Rascal={
 firstName: 'King'
 }
 Rascal.describe=Keith.describe;
 console.log(Rascal.describe()); //'King'
上面代码中,Keith对象中的describe属性赋给Rascal,于是describe方法中当前所在的对象就是Rascal,所以this.firstName就指向Rascal。因为是传址传递,所以修改firstName会对原对象有影响。这个例子可能不便于理解,再看看下面这个例子。
function f(){
 return this.firstName;
 }
 var Keith = {
 firstName: 'Chou',
 describe:f
 };
 var Rascal={
 firstName: 'King',
 describe:f
 }
 console.log(Keith.describe()); //'Chou'
 console.log(Rascal.describe()); //'King'
上面代码中,把方法移到全局作用域下,函数f内部使用了this关键字。随着f所在的对象不同,this指向也就不同。
在全局作用域下this关键字会指向顶层对象(也就是window对象)。
var name='keith';
 function person(){
 var name='rascal';
 return this.name;
 }
console.log(person()); //'keith'
上面代码中,返回的是keith而不是rascal。原因在于this指向的是全局作用域。在全局作用域中定义一个函数,默认是指向window对象,而不是函数本身。但是,如果在函数内部不使用var来声明一个局部变量,那结果也会不同。
var name='keith';
 function person(){
 name='rascal';
 return this.name;
 }
console.log(person()); //'rascal'
上面代码中,在函数内部没有使用var来声明一个局部变量,那么此时函数内部的name属性不是局部变量,而是全局变量。所以会覆盖掉前面的name属性。如果对于局部变量和全局变量不了解,可以访问 这篇文章 。
只要函数被赋给另外一个变量,this的指向会发生改变。
var Keith={
 name:'keith',
 describe:function(){
  return this.name;
 }
 }
var name='rascal';
var f=Keith.describe;
console.log(f()) //'rascal'
上面代码中,返回的是rascal,而不是keith。因为Keith.describe被赋值给了f变量,而全局作用域下有一个name变量,所以Keith内部的函数的this指向就会指向f运行时所在的对象(顶层对象,也就是window对象)
总结一下:
1.javascript语言中,一切皆为对象(除了 undefined 和 null 之外),运行环境也是对象,所以函数都是在某个对象之中运行,this就是这个对象(环境)。
2.this的指向是动态的。如果函数在全局作用域中,那么this就会指向全局环境;如果函数位于某个对象中,那么this就会指向该对象。
2.使用场合
this的使用场合可以分为以下几个场合。
2.1:全局环境(全局作用域)
在全局作用域中使用this对象,它指向的就是顶层对象,也就是window对象。
 function keith() {
 return (this === window)
 }
console.log(keith()) //true
上面代码中,不管是不是在函数内部,只要在全局作用域下运行,this就是指向顶层对象window。
2.2:构造函数
构造函数中的this,指向的是将要创建的对象实例。
function Keith() {
 this.sex = 'boy';
 }
 var person = new Keith();
 console.log(person.sex); //'boy'
上面代码中,在全局作用域下定义了Keith构造函数,然后调用构造函数并赋值给person对象实例。
构造函数创建的三个基本要求:函数名首字母大写;构造函数内部使用this关键字来指向即将生成的对象实例;使用new关键字来调用构造函数并返回对象实例。
如果想更进一步深入了解构造函数与new关键字的关系,请移步至 这篇文章 。
2.3:对象的方法
当A对象的方法被赋予B对象,该方法中的this就从指向A对象变成指向B对象。所以要特别小心,将某个对象的方法赋值个另外一个对象时,会改变this的指向。
var keith = {
 sex: 'boy',
 foo: function() {
  return this.sex;
 }
 };
 var rascal = {
 sex: 'girl'
 };
 rascal.foo = keith.foo;

[1] [2]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载