思维导图
为什么要使用this
当时是它有好处呀,方便,毕竟它喜欢瞎几把乱指,其实人家this并没有好。是个规规矩矩的乖孩子。
为什么使用: this 提供了一种更优雅的方式来隐式“传递”一个对象引用。可以简化开发者的工作,当时前提是你彻底搞懂它的机制。
this 关键字是 JavaScript 中最复杂的机制之一。它是一个很特别的关键字,被自动定义在 所有函数的作用域中。
function getName(obj) { console.log(obj.name); } function getName1() { console.log(this.name); } var obj = { name:'铁憨憨' } getName(obj); // 铁憨憨 getName1.call(obj); // 铁憨憨 复制代码
直接传递对象作为函数的参数,和使用this指向obj对象效果是一样的。
当我们书写更复杂跟 * 山一样的代码,this就更加显得重要了。
this误解
this 指向函数自身 ?
先说明这是错误的。不信?下面来个例子
var where = '跑路了' function fn() { console.log(this.where); // 跑路了 console.log(fn.where); // "无名氏" } fn.where = '无名氏' fn() 复制代码
所以this 指向函数自身是错误的哦~
this 指向函数的作用域
在某种情况下它是正确的,但是在其他情况下它却是错误的。这只是某一种情况而已。
注意: this 在任何情况下都不指向函数的词法作用域
function foo() { var a = 2; this.bar(); } function bar() { console.log(this.a); } foo(); // ReferenceError: a is not defined 复制代码
调用 bar() 最自然的方法是省略前面的 this,直接使用词法引用标识符,不能使用 this 来引用一 个词法作用域内部的东西。
this到底是什么?
当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包 含函数在哪里被调用(调用栈)、函数的调用方法、传入的参数等信息。this 就是记录的 其中一个属性,会在函数执行的过程中用到。
其实this指向关键是看函数是如何调用的,箭头函数除外,箭头函数是看源代码写哪了。下篇文写~