1、this

JavaScript中谁执行函数,this指向谁
setTimeout为window方法,this指向window

  1. <button id="btn">btn</button>
  2. <!-- this -->
  3. <script>
  4. var id = 1001;
  5. var btn = document.getElementById("btn");
  6. btn.onclick=function(){
  7. console.log(this);
  8. console.log(this.id);
  9. setTimeout(function(){ //setTimeout为window方法,this指向window
  10. console.log(this);
  11. console.log(this.id);
  12. },1000)
  13. }
  14. </script>

image.png

2、改变函数this指向问题

使用箭头替换function使this指向事件本身

  1. <button id="btn">btn</button>
  2. <!-- this -->
  3. <script>
  4. /* 1、使用箭头可以解决this关键字指向问题 */
  5. var id = 1001;
  6. var btn = document.getElementById("btn");
  7. btn.onclick=function(){
  8. console.log(this);
  9. console.log(this.id);
  10. setTimeout(()=>{ //使用箭头替换function使this指向事件本身
  11. console.log(this);
  12. console.log(this.id);
  13. },1000)
  14. }
  15. </script>

image.png

3、普通函数this指向window

函数内部调用一个普通函数this指向window

  1. <button id="btn">btn</button>
  2. <!-- this -->
  3. <script>
  4. var id = 1001;
  5. var btn = document.getElementById("btn");
  6. /* 函数内部调用一个普通函数this指向window */
  7. btn.onclick=function(){
  8. go();
  9. }
  10. function go(){
  11. console.log(this.id)
  12. }
  13. </script>

image.png

4、bind,call与apply方法

4-1.bind()

bind可以改变函数运行的上下文环境,bind函数中的参数传谁,this就指向谁

  1. <!-- bind,call,apply -->
  2. <script>
  3. var name = "window";
  4. var obj = {
  5. name:"obj",
  6. sayName:function(){
  7. console.log(this.name)
  8. }
  9. }
  10. /*
  11. 1、事件中,谁执行事件指向谁
  12. 2、对象的方法中,谁执行方法指向谁
  13. */
  14. obj.sayName();
  15. /* bind可以改变函数运行的上下文环境,bind函数中的参数传谁,this就指向谁 */
  16. var show = function(){
  17. console.log(this.name);
  18. }.bind(obj)
  19. show();
  20. </script>

image.png
使用场景:

  1. <button id="btn">btn</button>
  2. <!-- this -->
  3. <script>
  4. var id = 1001;
  5. var btn = document.getElementById("btn");
  6. btn.onclick=function(){
  7. setTimeout(function(){
  8. console.log(this.id);
  9. }.bind(btn),1000)
  10. }
  11. </script>

image.png
that写法:

  1. <button id="btn">btn</button>
  2. <!-- this -->
  3. <script>
  4. var id = 1001;
  5. var btn = document.getElementById("btn");
  6. btn.onclick=function(){
  7. var that = this;
  8. setTimeout(function(){
  9. console.log(this.id);
  10. }.bind(that),1000)
  11. }
  12. </script>

image.png

4-2.call(),apply()方法

call(),apply()也可以改变函数内部this关键字的指向
1、call,apply是调用的时候执行
2、bind仅仅是改变了函数上下文的运行环境,不会马上执行

  1. <!-- bind,call,apply -->
  2. <script>
  3. var name = "window";
  4. var obj = {
  5. name:"obj",
  6. sayName:function(){
  7. console.log(this.name)
  8. }
  9. }
  10. function go(){
  11. console.log(this.name)
  12. }
  13. go();
  14. /* call也可以改变函数内部this关键字的指向
  15. go.call(changeThis)
  16. */
  17. go.call(obj);
  18. go.apply(obj);
  19. /* bind,call,apply
  20. 1、call,apply是调用的时候执行
  21. 2、bind仅仅是改变了函数上下文的运行环境,不会马上执行
  22. */
  23. </script>

image.png

4-3.call()和apply()的区别

函数存在多个参数的情况,call按顺序传参,apply必须传数组

  1. <script>
  2. var name = "window";
  3. var obj = {
  4. name:"obj",
  5. }
  6. /* 函数存在多个参数的情况,call按顺序传参,apply必须传数组 */
  7. function go(a,b){
  8. console.log(this.name);
  9. console.log(a+b)
  10. }
  11. go(2,3)
  12. go.call(obj,2,3)
  13. go.apply(obj,[2,3])
  14. </script>

image.png