this指向
+ 定义:
=> this 是一个使用在作用域内部的关键字
=> 全局很少有, 大部分是在函数内部使用
+ 指向:
=> 全局使用: window
=> 函数使用: **不管函数怎么定义, 不管函数在哪定义, 只看 this 在函数里的调用(箭头函数除外)**
-> 普通调用(直接调用/全局调用)
+ 函数名(): this -> window
-> 对象调用
+ xxx.函数名(): this -> 点前面是谁就是谁
-> 定时器处理函数
+ setTimeout(function(){}, 0): this -> window
+ setInterval(function(){}, 0): this -> window
-> 事件处理函数
+ xxx.onclick = function(){}: this -> 事件源(绑定在谁身上的事件, 而不是由谁触发)
+ xxx.addEventListener('', function(){}): this -> 事件源
-> 自执行函数
+ (function(){})(): this -> window
function fn(){
console.log(this)
}
fn()
var obj = {
f: fn,
name: '我是 obj 对象'
}
obj.f()
setTimeout(fn, 0)
setTimeout(obj.f, 0)
var div = document.querySelector('div')
div.onclick = obj.f
div.addEventListener('click', obj.f)
function fn(){
console.log(this)
}
fn()
setTimeout(function(){
fn()
},0)
var div = document.querySelector('div')
div.onclick = function(){
console.log(this)
fn()
}
var div = document.querySelector('div')
div.onclick = function(){
function f(){
console.log(this)
}
f()
}
var obj = {
name: '我是 obj 对象',
fn: function(){ console.log(this) }
}
obj.fn()
var f = obj.fn
f()
var obj = {
name: '我是 obj 对象',
fn: function(){
console.log(this)
function fun(){
console.log(this)
}
fun()
}
}
obj.fn()
改变this指向
改变 this 指向
+ this 有他本身的指向性
+ 不管你本身指向哪里, 我让你指向谁, 你就指向谁
+ 三个方法
1. call()
2. apply()
3. bind()
1. call()
+ 使用方法: 直接连接在函数名后面使用就行
+ 语法:
-> fn.call()
-> obj.fn.call()
+ 参数:
-> 第一个参数, 就是函数内部的 this 指向
-> 第二个参数开始, 依次给函数传递参数
+ 特点:
-> 会立即执行函数(不适合用作定时器处理函数或者事件处理函数)
+ 作用: 伪数组借用数组方法
function fn(a, b){
console.group('fn 函数')
console.log(this)
console.log(a)
console.log(b)
console.groupEnd()
}
var obj = {
name: '我是 obj 对象'
}
fn(10, 20)
fn.call(obj, 100, 200)
function f(){
console.log(arguments)
var res = [].every.call(arguments, function(item){return item >= 8 })
console.log(res)
}
f(10, 20, 30, 40, 50)
2. apply()
+ 使用方法: 就直接连接在函数名后面使用
+ 语法:
-> fn.apply()
-> obj.fn.apply()
+ 参数:
-> 第一个参数, 就是函数内部的 this 指向
-> 第二个参数, 是一个数组或者伪数组都行, 里面的每一项依次给函数传递参数
+ 特点:
-> 会立即执行函数(不适合用作定时器处理函数或者事件处理函数)
+ 作用: 可以以数组的形式给某些功能函数传参
-> Math.max()
fn.apply(obj, [1000, 'world'])
var arr = [100, 23, 45, 59, 91]
var res = Math.max.apply(null, arr)
console.log(res)
3. bind()
+ 使用方法: 就直接连接在函数名后面使用
+ 语法:
-> fn.bind()
-> obj.fn.bind()
+ 参数:
-> 第一个参数, 就是函数内部的 this 指向
-> 从第二个参数, 依次给函数传递参数
+ 特点:
-> 不会立即执行函数
-> 会返回一个新的函数, 一个已经被改变好 this 指向的函数
+ 作用: 改变事件处理函数或者定时器处理函数的 this 指向 或 传参, 改 this 指向很少用, 一般用来传参
var res = fn.bind(obj, 'hello', 'world')
res()
var div = document.querySelector('div')
function handler(a, b){
console.log(this)
console(a, b)
}
var obj = { name: '我是 obj 对象' }
div.onclick = handler.bind(obj, 100, 200)
|