1.函数作为普通函数调用,this指向window

  1. var name="张三";
  2. function show(){
  3. console.log(this.name);
  4. }
  5. function go(){
  6. var name="李四";
  7. show();
  8. }
  9. go();
  10. //window.go()

2.改变this关键字指向方法:call,apply,bind

(1)ccll方法

  1. var name="张三";
  2. var obj={
  3. name:"李四"
  4. }
  5. function go(){
  6. console.log(this.name);
  7. }
  8. go();// 输出张三
  9. go.call(obj);//李四

(2)apply方法

  1. var name="张三";
  2. var obj={
  3. name:"李四"
  4. }
  5. function go(){
  6. console.log(this.name);
  7. }
  8. go();// 输出张三
  9. go.apply(obj);//李四

(3)bind方法

  1. bind绑定的函数不会马上执行,只是改变了函数上下文的执行环境<br /> call ,applay调用的时候会马上执行
  1. var name="window"
  2. var zhang={
  3. name:"李四"
  4. }
  5. var show=function(a,b){
  6. console.log(this.name);
  7. console.log(a+b);
  8. }.bind(zhang);
  9. show(2,3);

(4)Call和apply之间的区别

如果要传递参数,apply跟数组

  1. var name="window"
  2. var zhang={
  3. name:"李四"
  4. }
  5. function show(a,b){
  6. console.log(this.name);
  7. console.log(a+b);
  8. }
  9. show(1,2) // 输出window 3
  10. show.call(zhang,2,3) //输出 李四 5
  11. show.apply(zhang,[1,2]) //输出 李四 3

3.使用场景 解决定时器在事件中的指向问题

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

解决方法:
(1)bind

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

(2)self方法

  1. <button id="btn">按钮</button>
  2. <script>
  3. var id = "1001"
  4. var btn = document.getElementById("btn");
  5. btn.onclick = function(){
  6. var self = this; //增进语义化
  7. setTimeout(function(){
  8. console.log(this.id)
  9. }.bind(self), 1000) //bind方法改变上下文执行环境
  10. }
  11. </script>

(3)使用箭头函数

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