龙空技术网

带你走进JavaScript世界系列——关于 this 对象

资深北漂假码农 242

前言:

此时小伙伴们对“jsthis获取当前对象”大概比较珍视,小伙伴们都需要了解一些“jsthis获取当前对象”的相关知识。那么小编在网上搜集了一些关于“jsthis获取当前对象””的相关内容,希望咱们能喜欢,咱们一起来了解一下吧!

在闭包中使用 this 对象可能会导致一些问题。this 对象是在运行时基于函数的执行环境绑定的:在全局函数中,this 等于 window,而当函数被作为某个对象的方法调用时,this 对象等于那个对象。不过,在匿名函数的执行环境具有全局性,因此其 this 对象通常指向 window。例:

闭包中关于 this 对象

以上代码创建了一个全局变量 name,又创建了一个包含 name 属性的对象。这个对象还包含一个 getNameFunc() 方法,它返回一个匿名函数,而匿名函数又返回 this.name 。由于 getNameFunc() 返回一个函数,因此调用 object.getNameFunc()() 就会立即调用它返回的函数,结果就是返回一个字符串。然后,这个例子返回的字符串是 "The Window",即全局 name 变量的值。为什么匿名函数没有取得其包含作用域的 this 对象?每个函数在被调用时都会自动取得两个特殊变量:this 和 arguments 。内部函数在搜索这两个变量时,只会搜索到其活动对象为止,因此永远不可能直接访问外部函数中的这两个变量。不过,把外部作用域中的 this 对象保存在一个闭包能够访问到的变量里,就可以让闭包访问该对象了,例:

闭包中的 this 对象

上面的代码与前一个的不同之处在于在定义匿名函数之前,把 this 对象赋值保存到另一个变量 that 中。定义闭包之后,闭包也可以访问这个变量,即使在函数返回之后,that 也仍然引用着 object,所以调用 getNameFunc()() 会返回 "My Object"。

在几种特殊情况下,this 值可能会发生改变。例:

this 对象意外发生改变

上面代码第一行 object.getName() 这个没有什么好解释的。第二行代码在调用这个方法前先给他加上了括号,就好像是在引用一个函数,但是 this 的值得到了维持,因为 object.getName 和 (object.getName) 定义是相同的。第三行代码先执行了一条赋值语句,然后再调用赋值后的结果。因为这个赋值表达式的值是函数本身,所以 this 的值不能得到维持,所以就返回了 "My Object" 。

标签: #jsthis获取当前对象