🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
### this * * * * * `this`其实一点都不难,他只有几个规则。 ``` // 全局变量a // let 就算在全局声明也不会挂载到window上 // 并且 let 不会 变量提升 而 var会 // 所以这里用var说明问题 var a = '全局变量' function foo () { console.log(this.a) } foo() // 全局变量 // obj变量a属性 var obj = { a: 'obj变量', foo: foo } obj.foo() // obj变量 ``` 上面是普通调用,`this`永远指向调用他的对象。 下面是优先级最高的`this`指向。 ``` function foo () { // 这里的this指向通过new 操作符的对象实例 // 也就是这里的c console.log(this.a) } var c = new foo() // 需要给实例c 添加 a 属性 否则是undefined c.a = 3 console.log(c.a) // 还有种就是利用 call,apply,bind 改变 this,这个优先级仅次于 new ``` `ES5`就只有上面几种情况,另外就是函数里面的函数`this`是指向`window`的 `ES6`还有一种箭头函数,下面让我们看看箭头函数中的 `this` ``` function a () { return () => { return () => { console.log(this) } } } a()()() ``` 箭头函数其实是没有 `this` 的,这个函数中的 `this` 只取决于他外面的第一个不是箭头函数的函数的 `this`。在这个例子中,因为调用 `a` 符合前面代码中的第一个情况,所以 `this` 是 `window`。并且 `this` 一旦绑定了上下文,就不会被任何代码改变。就是说是最高优先级。