一、|| 和 && 运算符的赋值

  • 或运算符

    从左向右,哪个值为真,就取哪个值 var a = 10 || 11; // 10 var a = null || 11; // 11

  • 且运算符

    • 第一个值为假,就取第一个值;
    • 第一个值为真,就取第二个值。

      var b = null && 2; // null var b = 10 && 20; // 20

二、this关键字

1、全局作用域下,this指向window

  1. function aa () {
  2. console.log(this);
  3. }

2、函数执行的时候,看函数前边有没有 点 ,有的话,点前面是谁,this;如果没有,就是window(严格模式下为undefined)

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

3、給元素绑定事件的时候,当事件触发,函数执行时,里面的this就是当前绑定的元素

  1. // 给元素绑定事件
  2. // ele.onclick = function () {
  3. // console.log(this);
  4. // }

4、自执行函数中的this,非严格模式下指向window

  • 非严格模式下:window
  • 严格模式下:undefined
  1. // 自执行函数里的this
  2. (function () {
  3. console.log(this); // window
  4. })()

5、回调函数里面的this指向window(严格模式下也是window)

  1. // 回调函数里面的this
  2. setTimeout (function () {
  3. console.log(this); // window
  4. }, 1000)
  5. function fn(callback) {
  6. console.log(this);
  7. callback();
  8. }
  9. fn(function () {
  10. console.log(this); // window 严格模式下为undefined
  11. })

6、通过 类 创造的实例,构造函数中的this指的就是当前的实例

  1. // 通过类 创建的实例,构造函数中的this指的就是当前实例
  2. function fn2() {
  3. this.name = aaa;
  4. this.age = 10;
  5. }
  6. var f1 = new fn2();
  7. var f2 = new fn2();

7、this指向可以通过call、apply、bind改变

  1. // 利用call() 该变this指向
  2. function aa () {
  3. console.log(this);
  4. }
  5. var obj = {
  6. name : "111",
  7. age : 12
  8. }
  9. aa.call(obj);

8、箭头函数中没有this,也没有arguments;但是箭头函数中用this,就去他的上级作用域去找(作用域链)

练习题

  1. // 练习题1
  2. let obj={
  3. name:"li",
  4. fn:(function(n){
  5. // 这里的this
  6. console.log(this);
  7. return function(){
  8. // 这里的this
  9. console.log(this);
  10. }
  11. })(10),
  12. }
  13. obj.fn();
  14. // 练习题2
  15. var num=10;
  16. var obj={num:20};
  17. obj.fn=(function(num){
  18. this.num=num*3; // window.num = 60
  19. num++; // 自执行函数的num = 21
  20. return function(n){
  21. this.num+=n; // window.num = 60+5 obj.num = 20+10
  22. num++; // 自执行函数的num=22 自执行函数的num=22+1
  23. console.log(num); // 自执行函数的num=22 自执行函数的num=22+1
  24. }
  25. })(obj.num);
  26. var fn=obj.fn;
  27. fn(5); // 函数执行的时候,fn()前边没有点,this指向window
  28. obj.fn(10); // 函数执行的时候,fn()前边是obj,this指向就是obj
  29. console.log(num, obj.num) // 65,30
  30. // 练习题3 !!
  31. var a = 1;
  32. var obj1 = {
  33. a: 0,
  34. fn1: (function (a) {
  35. this.a = a;
  36. a++;
  37. return function () {
  38. this.a = a++;
  39. console.log(a)
  40. }
  41. })(a)
  42. };
  43. obj1.fn1();
  44. var fn1 = obj1.fn1;
  45. fn1();
  46. console.log(a);
  47. console.log(obj1.a);
  48. // 练习题4
  49. var num = 1;
  50. var obj = {
  51. num: 2,
  52. fn: (function () {
  53. this.num *= 2;
  54. num += 3;
  55. var num = 1;
  56. return function () {
  57. num += 2;
  58. this.num += 2
  59. console.log(++num);
  60. }
  61. })()
  62. };
  63. var f = obj.fn;
  64. f();
  65. obj.fn();
  66. console.log(window.num, obj.num);
  67. // 练习题5
  68. var num = 10;
  69. var obj = {
  70. num: 15
  71. };
  72. obj.fn = (function (num) {
  73. this.num += 10;
  74. num *= 2;
  75. return function (n) {
  76. this.num += n;
  77. console.log(n + (--num));
  78. }
  79. })(obj.num);
  80. var fn = obj.fn;
  81. fn(10);
  82. obj.fn(15);
  83. console.log(window.num, obj.num);

练习题答案

  1. // 练习题3
  2. var a = 1;
  3. var obj1 = {
  4. a: 0, // obj1.a = 0 ==> 2
  5. fn1: (function (a) {
  6. this.a = a; // window.a = 1
  7. a++; // 私有a = 1+1
  8. return function () {
  9. this.a = a++; // obj1.a = 私有a=2,私有a++=3; window.a = 私有a = 3,私有a++ = 4
  10. console.log(a) // 私有a = 3 ; 私有a = 4
  11. }
  12. })(a)
  13. };
  14. obj1.fn1();
  15. var fn1 = obj1.fn1;
  16. fn1();
  17. console.log(a); //3
  18. console.log(obj1.a); //2
  19. // 练习题4
  20. var num = 1;
  21. var obj = {
  22. num: 2, // obj.num = 2 ==> 4
  23. fn: (function () {
  24. // var 了私有num = undefined ==>4
  25. this.num *= 2; // window.num = 1*2
  26. num += 3; // 私有num = undefined+3
  27. var num = 1; // 私有num = 1
  28. return function () {
  29. num += 2; // 私有num = 1+2 私有num = 4 + 2
  30. this.num += 2 // window.num = 1*2 + 2 obj.num = 2+2
  31. console.log(++num); // 私有num = 1+2+1 私有num = 4+2+1
  32. }
  33. })()
  34. };
  35. var f = obj.fn;
  36. f();
  37. obj.fn();
  38. console.log(window.num, obj.num); // 4,4
  39. // 练习题5
  40. var num = 10;
  41. var obj = {
  42. num: 15
  43. };
  44. obj.fn = (function (num) {
  45. // 传入实参num = 15
  46. this.num += 10; // window.num = 10+10
  47. num *= 2; // 私有num = 15*2
  48. return function (n) {
  49. this.num += n; // window.num = 20+10 obj.num = 15+15
  50. console.log(n + (--num)); // 10+(私有num)30-1 15+(私有num)29-1
  51. }
  52. })(obj.num);
  53. var fn = obj.fn;
  54. fn(10);
  55. obj.fn(15);
  56. console.log(window.num, obj.num); // 30,30