THIS : 函数执行的主体,(谁把函数执行了,this就是谁)
- 事件绑定
- 函数执行 [普通函数执行,成员访问,匿名函数,回调函数 …]
- 函数构造
- 箭头函数 [生成器函数 generator]
- 基于 call/apply/bind强制修改this指向
console.log(this)
//this -> 全局上下文中的 this:window
块级上下文中没有自己的this,所用的this都是继承上级上下文中的this [箭头函数也是]
*事件绑定
DOM0: xxx.onxxx = function(){}
DOM2:
xxx.addEventListenter(‘xxx’, function(){}) // 不兼容IE6/7/8 —对应的移除事件绑定 remove…
document.body.attachEvent(‘onxxx’, function(){}) // 兼容IE6/7/8 —对应的移除事件绑定dis….
给当前元素的某个事件行为绑定方法 [创建方法,方法还没执行]当事件行为触发,浏览器会把绑定的函数执行,此时函数中的this 是当前元素对象本身
特殊性:
基于attachEvent实现事件绑定,方法执行,方法中的this是window
document.body.addEventListener(‘click’, function(){
console.log(this) // this -> body
})
- 函数执行
正常普通函数执行,看函数执行前是否有 “点”,“点” 前面是谁 this就是谁,没有this,this就是window [严格模式下是undefined]
匿名函数:
函数表达式:等同于普通函数或者事件绑定等机制
自执行函数:this一般都是window/undefined
回调函数:一般都是window/undefined,但是如果另外函数执行中,对回调函数的执行做了特殊处理,以自己处理的为主
括号表达式:小括号包含“多项”,这样也只取最后一项,但是this收到影响(一般是window/undefined)
“use strict” //开启严格模式(默认非严格模式)严格模式下 全局this为undefined 【高程3 严格模式/非严格模式区别】
function fn(){
console.log(this)
}
let obj = {
name: ‘zhufeng’,
fn
}
fn() // this -> window/undefined
obj.fn() // this -> obj
(10, obj.fn)() // this -> window/undefined
// 自执行函数
(function(x){
console.log(this) // this -> window/undefined
})(10) // 实参
//回调函数:把一个函数A当作实参,传递给;另外一个执行的函数B [在B函数执行中,可以把A执行]
function fn(callback){
// callback -> 匿名函数
callback() // callback执行等于让fn执行
}
fn(function()
console.log(this)
{})
let arr = [10, 20, 30]
arr.forEach(function(){
console.log(this) // window
})
arr.forEach(function(){
console.log(this) // 第二个参数对象 forEach内部做处理了
},{aa: ‘aaa’})
setTimeout(function(x){
console.log(this, x) // this-> window 10
},1000, 10) // 多余的会作为参数传递
面试题: