欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

this有关

程序员文章站 2022-07-13 11:35:06
...

问答


理解this

this不是编写时绑定,而是运行时绑定。它依赖于函数调用的上下文条件。this绑定和函数声明的位置无关,反而和函数被调用的方式有关。

函数是和new一起被调用的吗(new绑定)?如果是,this就是新构建的对象。

var bar = new foo()

函数是用call或apply被调用(明确绑定),甚至是隐藏在bind 硬绑定 之中吗?如果是,this就是明确指定的对象。

var bar = foo.call( obj2 )

函数是用环境对象(也称为拥有者或容器对象)被调用的吗(隐含绑定)?如果是,this就是那个环境对象。

var bar = obj1.foo()

否则,使用默认的this(默认绑定)。如果在strict mode下,就是undefined,否则是global对象。
var bar = foo()

以上,就是理解对于普通的函数调用来说的this绑定规则所需的全部。是的···几乎是全部。

???? apply、call有什么作用,什么区别。

  • apply()和call()函数都可以指定this值和参数值的情况下调用某个函数。
  • call()和apply()的作用一样,区别在于提供给原函数的参数的方式不一样
  • apply()函数数只接受两个参数,提供给原函数的参数以数组或类数组对象的形式存在
  • call()接收无限个参数, 第二个参数及其后面的参数就是提供给原函数的参数。

代码


  • 下面代码输出什么,为什么
var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() //  ⬅️输出John:hi!
  • 下面代码输出什么,为什么
func()  ⬅️ //输出window对象

function func() { 
  alert(this)
}

因为是全局变量调用函数

  • 下面代码输出什么,为什么
function fn0(){
    function fn(){
        console.log(this); ⬅️ //输出window对象
    }
    fn();
}

fn0();


document.addEventListener('click', function(e){
    console.log(this);⬅️ //输出document对象因为document调用
    setTimeout(function(){
        console.log(this);⬅️ //输出window对象
    }, 200);
}, false);
  • 下面代码输出什么,why?
var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)

通过call()函数调用,此时this为John对象,输出"John"

  • 下面代码输出什么,为什么
var john = { 
  firstName: "John",
  surname: "Smith"
}

function func(a, b) { 
  alert( this[a] + ' ' + this[b] )
}
func.call(john, 'firstName', 'surname')

弹出 john smith
因为 call方法可以接收 参数列表

  • 以下代码有什么问题,如何修改
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指的是$btn
      this.showMsg();
    })
  },
  
  showMsg: function(){  
    console.log('饥人谷');
  }
}

改为

var module= {
  bind: function(){
      var me = this; ⬅️ 存在变量中
    $btn.on('click', function(){
      console.log(this) 
      me.showMsg();  ⬅️ 再调用
    })
  },
  
  showMsg: function(){  
    console.log('饥人谷');
  }
}

this资料

                   本文版权归作者_Josh和饥人谷所有,转载请注明来源