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

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

98a76ad5800aef87a73c7a648b079e95.png

闭包中关于 this 对象

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

9bec390c8c11cd2bacbadfac19c5d85a.png

闭包中的 this 对象

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

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

94db45c50317304c6aba1ebde2746e02.png

this 对象意外发生改变

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值