本文共 1972 字,大约阅读时间需要 6 分钟。
每一个函数内部都有一个关键字是 this
可以让我们直接使用的
重点: 函数内部的 this 只和函数的调用方式有关系,和函数的定义方式没有关系
函数内部的 this 指向谁,取决于函数的调用方式
全局定义的函数直接调用,this => window
function fn() { console.log(this)}fn()// 此时 this 指向 window
对象内部的方法调用,this => 调用者
var obj = { fn: function () { console.log(this) }}obj.fn()// 此时 this 指向 obj
定时器的处理函数,this => window
setTimeout(function () { console.log(this)}, 0)// 此时定时器处理函数里面的 this 指向 window
事件处理函数,this => 事件源
div.onclick = function () { console.log(this)}// 当你点击 div 的时候,this 指向 div
自调用函数,this => window
(function () { console.log(this)})()// 此时 this 指向 window
call
方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
语法: 函数名.call(要改变的 this 指向,要给函数传递的参数1,要给函数传递的参数2, ...)
var obj = { name: 'fqniu' }function fn(a, b) { console.log(this) console.log(a) console.log(b)}fn(1, 2)fn.call(obj, 1, 2)
fn()
的时候,函数内部的 this 指向 windowfn.call(obj, 1, 2)
的时候,函数内部的 this 就指向了 obj 这个对象apply
方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
语法: 函数名.apply(要改变的 this 指向,[要给函数传递的参数1, 要给函数传递的参数2, ...])
var obj = { name: 'fqniu' }function fn(a, b) { console.log(this) console.log(a) console.log(b)}fn(1, 2)fn.apply(obj, [1, 2])
fn()
的时候,函数内部的 this 指向 windowfn.apply(obj, [1, 2])
的时候,函数内部的 this 就指向了 obj 这个对象bind
方法是附加在函数调用后面使用,可以忽略函数本身的 this 指向
和 call / apply 有一些不一样,就是不会立即执行函数,而是返回一个已经改变了 this 指向的函数
语法: var newFn = 函数名.bind(要改变的 this 指向); newFn(传递参数)
var obj = { name: 'fqniu' }function fn(a, b) { console.log(this) console.log(a) console.log(b)}fn(1, 2)var newFn = fn.bind(obj)newFn(1, 2)
fn(1, 2)
的时候 this 指向 windownewFn(1, 2)
的时候执行的是一个和 fn 一模一样的函数,只不过里面的 this 指向改成了 obj转载地址:http://xdomz.baihongyu.com/