一、this指向问题

1.在事件里面,this指的是事件前面的东西

2.普通函数看点,函数前面有点,点前面是谁,那this就是谁,没有点就是window。(严格模式下是undefined)

3.自执行函数是window,严格模式(use strict)下是undefined。

4.回调函数里面指的是window。

5.箭头函数没有this,要用的话指的是上级作用域中的this。

1、全局下指的是window

  1. console.log(this);

2、函数调用的情况

函数执行就看函数前有没有点,如果有,点前面是谁,this就是谁,如果没有,this就是window,或者严格模式下的undefined

  1. //'use strict'
  2. function fn(){
  3. console.log(this)
  4. }
  5. fn();//这里的this就是window,在严格模式下就是undefined
  6. var obj={
  7. name:"li",
  8. fn:fn,
  9. }
  10. obj.fn();//这里的this就是obj

自执行的函数一般是window,严格模式下是undefined

  1. //'use strict';
  2. (function () {
  3. console.log(this)//window
  4. })()

回调函数:一般来说是window,除非在执行回调函数「内部方法」做了特殊处理

  1. <body>
  2. <div id="box">11111</div>
  3. <script>
  4. box.onclick = function () {
  5. console.log(this)
  6. }
  7. </script>
  8. </body>
  1. setTimeout(function (){
  2. console.log(this);
  3. }, 1000);

THIS练习题

1、

  1. var name="珠峰培训";
  2. function fn(){
  3. console.log(this.name)
  4. }
  5. var obj={
  6. name:"你好世界",
  7. fn:fn
  8. }
  9. obj.fn();
  10. fn();
  11. (function(){
  12. this.fn();
  13. })();

答案:你好世界 珠峰培训 珠峰培训

2、

  1. var a = 10;
  2. function foo () {
  3. console.log(this.a)
  4. }
  5. foo();

答案:10

3、

  1. var a = 10;
  2. function foo () {
  3. console.log('this1', this)
  4. console.log(window.a)
  5. console.log(this.a)
  6. }
  7. console.log(window.foo)
  8. console.log('this2', this)
  9. foo();

答案:函数 window window 10 10

4、

  1. let a = 10
  2. const b = 20
  3. function foo () {
  4. console.log(this.a)
  5. console.log(this.b)
  6. }
  7. foo();
  8. console.log(window.a)

答案:undefined undefined undefined

5、

  1. var a = 1
  2. function foo () {
  3. var a = 2
  4. console.log(this)
  5. console.log(this.a)
  6. }
  7. foo()

答案:window 1

6、

  1. var obj1 = {
  2. a: 1
  3. }
  4. var obj2 = {
  5. a: 2,
  6. foo1: function () {
  7. console.log(this.a)
  8. },
  9. foo2: function () {
  10. setTimeout(function () {
  11. console.log(this)
  12. console.log(this.a)
  13. }, 0)
  14. }
  15. }
  16. var a = 3
  17. obj2.foo1()
  18. obj2.foo2()

答案:2 window 3

7、

  1. let obj={
  2. name:"li",
  3. fn:(function(n){
  4. // 这里的this
  5. console.log(this);
  6. return function(){
  7. // 这里的this
  8. console.log(this);
  9. }
  10. })(10),
  11. }
  12. obj.fn();

答案:window 对象obj

8、

  1. function fn(){
  2. // 这里的this
  3. console.log(this);
  4. }
  5. box.onclick=function(){
  6. console.log(this);
  7. fn()
  8. }

答案:box元素 window

9、

  1. var num=10;
  2. var obj={num:20};
  3. obj.fn=(function(num){
  4. this.num=num*3;
  5. num++;
  6. return function(n){
  7. this.num+=n;
  8. num++;
  9. console.log(num);
  10. }
  11. })(obj.num);
  12. var fn=obj.fn;
  13. fn(5);
  14. obj.fn(10);
  15. console.log(num,obj.num)

答案:22 23 65 30

10、

  1. var obj = {
  2. name: 'obj',
  3. foo1: () => {
  4. console.log(this.name)
  5. },
  6. foo2: function () {
  7. console.log(this.name)
  8. return () => {
  9. console.log(this.name)
  10. }
  11. }
  12. }
  13. var name = 'window'
  14. obj.foo1()
  15. obj.foo2()()

答案:window obj obj

11、

  1. var name = 'window'
  2. var obj1 = {
  3. name: 'obj1',
  4. foo: function () {
  5. console.log(this.name)
  6. }
  7. }
  8. var obj2 = {
  9. name: 'obj2',
  10. foo: () => {
  11. console.log(this.name)
  12. }
  13. }
  14. obj1.foo()
  15. obj2.foo()

答案:obj1 window

12、

  1. var name = 'window'
  2. var obj1 = {
  3. name: 'obj1',
  4. foo: function () {
  5. console.log(this.name)
  6. return function () {
  7. console.log(this.name)
  8. }
  9. }
  10. }
  11. var obj2 = {
  12. name: 'obj2',
  13. foo: function () {
  14. console.log(this.name)
  15. return () => {
  16. console.log(this.name)
  17. }
  18. }
  19. }
  20. var obj3 = {
  21. name: 'obj3',
  22. foo: () => {
  23. console.log(this.name)
  24. return function () {
  25. console.log(this.name)
  26. }
  27. }
  28. }
  29. var obj4 = {
  30. name: 'obj4',
  31. foo: () => {
  32. console.log(this.name)
  33. return () => {
  34. console.log(this.name)
  35. }
  36. }
  37. }
  38. obj1.foo()()
  39. obj2.foo()()
  40. obj3.foo()()
  41. obj4.foo()()

答案:

  1. obj1.foo()() // 'obj1' 'window'
  2. obj2.foo()() // 'obj2' 'obj2'
  3. obj3.foo()() // 'window' 'window'
  4. obj4.foo()() // 'window' 'window'