1 含义:
函数的执行体(不等价于执行上下文(作用域))--->谁把函数执行; 谁操作了这个函数
2 情况:
在浏览器端运行js代码, 非函数中的this一般都是window 有一个特殊的,就是ES6+中块级上下文中this, 就是执行上下文中this[理解为: 块级上下文是没有自己的this]
2.1事件绑定
- 不论是DOM0级还是DOM2级事件绑定,给元素E的某个事件行为绑定方法,当事件触发方法执行,方法中的this是元素本身
+ 特殊情况
-
IE6~8 基于attachEvent实现的DOM2级事件绑定, 事件触发方法执行,方法中的this不在是元素本身,大部分情况都是window
-
如果基于call/apply强制改变函数中的this,我们以强制改变的为主
2.2普通函数
+函数执行,看函数前面是否有"点", 如果有"点", "点"前面是谁,this就是谁,没有"点"this就是window[js 严格模式下是undefined]
fnI)---->this: window/undefined
obj.fn()---->this: obj
xxxx.proto.fn() ----> this: xxxx.proto
-
自执行函数执行,一般都是window/undefined
-
回调函数中的this一般也是window/undefined,除非做了特殊处理
+括号表达式,
(fn, 10, obj.fn)(); // this---->window 小括号中有多项,只取最后一项,如果把其执行,不论this之前是谁,现在基本都是window.
(obj.fn)() 小括号只有一份,不算括号表达式.
+箭头函数:
箭头函数中没有自己的this,所用到的this是所处上下文中this
改变this的指向:Function.prototype: call/apply
call/apply
-
都是立即执行函数,并且改变函数中的this和传递参数。
-
区别: 传递参数的区别,apply需要将传递的参数放到一个数组,而call是一个个传递,结果都是把这些参数一个个的传递给fn;
call: 在非严格模式下,context不传或者传递null/undefined,则this都改为window,严格模式下,不传是undefined,否则传递谁,就是谁。