[关闭]
@GivenCui 2016-05-25T19:14:26.000000Z 字数 2229 阅读 707

重新认识this关键字

js高级



目录



JS课程合集跳转链接


一.概念

在JS中,所有函数都运行在某个运行环境中,对于JS而言,一切皆对象,运行环境也是对象,所以函数中的this关键字的指向,也是根据当前对象(运行环境)而定的.

  1. // this关键字的举例
  2. // 在构造函数中,this指向的就是该构造函数所创建的实例对象.
  3. function Person () {
  4. this.name = "abc";
  5. }
  6. var person1 = new Person();
  7. person1.name = "bcd";
  8. console.log(person1.name); // bcd
  9. var person2 = new Person();
  10. console.log(person2.name); // abc
  11. // this自动找到实例对象的指针,可以理解为已经关联好了
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>强大的this</title>
  6. <script type = "text/javascript">
  7. // this在这种运行环境中,就代表当前点击的按钮对象
  8. function btnClick (ele){
  9. alert(ele.value); // 谁点就指向谁
  10. }
  11. </script>
  12. </head>
  13. <body>
  14. <input type = "button" value = "这是一个按钮" onclick="btnClick(this);" />
  15. <input type = "button" value = "这是另一个按钮" onclick="btnClick(this);" />
  16. </body>
  17. </html>

二 . 进阶

在JS中,因为JS是动态脚本语言,运行环境是动态切换的,即this关键字的指向也是跟着动态切换的.

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>this随环境动态切换</title>
  6. </head>
  7. <body>
  8. <script type = "text/javascript">
  9. function fn () {
  10. console.log(this.name)
  11. }
  12. // 创建一个字面量对象 ( JSON )
  13. var a = {
  14. name : "a",
  15. aFn : fn // 是个对象
  16. }
  17. // 再创建一个字面量函数
  18. var b = {
  19. name : "b";
  20. bFn : fn // 是个对象,也指向fn
  21. }
  22. // 提现了根据环境动态切换
  23. a.aFn(); // a
  24. b.bFn(); // b
  25. </script>
  26. </body>
  27. </html>

this关键字的使用场景

1.全局环境中

全局环境中this指向的是最顶端的window对象

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. <script type = "text/javascript">
  7. // 1. this的全局环境指向window
  8. console.log(this === window); // true
  9. </script>
  10. </head>
  11. <body>
  12. </body>
  13. </html>

2.构造函数中

构造函数中this指向的是该构造函数所创建的实例对象

  1. // this在构造函数中
  2. function(){
  3. this.name = "张飞";
  4. }
  5. Person.prototype.say = function () {
  6. console.log (this.name);
  7. }
  8. // 创建一个实例
  9. var person = new Person();
  10. person.say(); // 张飞

3.对象方法中

如果某个对象的方法指向了另外一个对象的某个方法,那么方法内部的this指向也会发生变化.

  1. // 对象方法中
  2. // 用字面量方式创建的对象
  3. // a有name属性和aFn方法
  4. var a = {
  5. name : "a",
  6. aFn : function () {
  7. alert(this.name)
  8. // alert(a.name) // 字面量可以这么写
  9. }
  10. }
  11. var b = {
  12. name : "b",
  13. // 为什么是b呢????
  14. // bFn : a.aFn 是取了地址指向了b所以b调用
  15. // 如何改成 bFn : a.aFn()
  16. // 是指把a.aFn()的返回值给了bFn;
  17. // 有函数()就是调用的函数
  18. /*
  19. bFn : a.aFn // b
  20. */
  21. /*
  22. bFn : function () {
  23. a.aFn() // a
  24. }
  25. */
  26. }

4. 常见问题

如果某个对象的层次机构很深,我们想把某个方法提取出来,不要直接去提取方法,而是提取方法所在的对象.

  1. // json的多层嵌套
  2. // c对象中有d对象
  3. var c = {
  4. d : {
  5. name : "刘a",
  6. fn : function () {
  7. console.log(this.name);
  8. console.log(this === window);
  9. }
  10. }
  11. }
  12. // 提取fn函数,目的为了简化开发
  13. /*
  14. // 提取出来了(这么提取不对)
  15. var myfn = c.d.fn; // myfn是个全局变量,存的只是地址
  16. // 这么提取的话,函数内部的this指向变成了window对象
  17. // 因为myfn是一个全局变量
  18. myfn(); // undefined true
  19. */
  20. // 正确的提取方法
  21. // 如果想把fn函数提取出来,而且this指针不改变的话,那么就提取fn函数所在的对象
  22. var myObj = c.d; // myObj是个对象
  23. myObj.fn1(); // 刘
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注