js编程-this的几种情况

131 阅读2分钟

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,否则传递谁,就是谁。