this基础:简单使用与apply、call

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

  • apply()是函数对象的一个方法,它的作用是改变函数的调用对象,即this的指向
  • 区别是:call接收的是参数列表,需要传入所需要的每一个参数,apply接收的是参数数组,参数存放在数组中
    fn.call(context, param1, param2…)
    fn.apply(context, paramArray)
    ···
    如果第一个参数为null,则this指向全局对象window,

代码

1. 以下代码输出什么?

1
2
3
4
5
6
7
8
var john = { 
firstName: "John"
}
function func() {
alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()
  • 弹出 John hi!,因为.sayHi() 是作为john对象的一个方法执行的,this从window指向了调用它的对象john

    2.下面代码输出什么,为什么

    1
    2
    3
    4
    5
    func() 

    function func() {
    alert(this)
    }
  • [Object Window],函数声明前置,所以func()可以执行,因为在全局环境执行下调用,所以输出Window

    3.下面代码输出什么

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function fn0(){
    function fn(){
    console.log(this);
    }
    fn();
    }

    fn0();

    document.addEventListener('click', function(e){
    console.log(this);
    setTimeout(function(){
    console.log(this);
    }, 200);
    }, false);
  • fn0(); 执行输出全局window对象,虽然this在嵌套函数中,但是调用的依然是window对象

  • 输出document,document绑定事件执行的函数,绑定事件的this指向原DOM对象
  • 输出window对象,因为setTimeout是全局作用域下的一个方法,函数调用时指向window对象

    4.下面代码输出什么,why

    1
    2
    3
    4
    5
    6
    7
    8
    var john = { 
    firstName: "John"
    }

    function func() {
    alert( this.firstName )
    }
    func.call(john)
  • John,call函数改变this的指向,func.call(john) 代表在john对象下执行函数func().

    5.代码输出?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    var john = { 
    firstName: "John",
    surname: "Smith"
    }

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

    6.以下代码有什么问题,如何修改

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    var module= {
    bind: function(){
    var _self = this;//保存module的this指向,在函数内部使用
    $btn.on('click', function(){
    console.log(this) //this指什么,this指的是dom对象btn
    _self.showMsg();//使用保存的module的this,可以调用module的showMsg()函数
    })
    },

    showMsg: function(){
    console.log('饥人谷');
    }
    }
文章目录
  1. 1. apply、call 有什么作用,什么区别
  • 代码
    1. 1. 1. 以下代码输出什么?
    2. 2. 2.下面代码输出什么,为什么
    3. 3. 3.下面代码输出什么
    4. 4. 4.下面代码输出什么,why
    5. 5. 5.代码输出?
    6. 6. 6.以下代码有什么问题,如何修改
  • ,