为什么函数无法访问其定义所在对象的属性?JS上下文丢失疑问
你混淆了JavaScript的词法作用域规则和this的动态绑定规则,这是两个完全独立的运行机制。
- 先看出错的写法:
setTimeout(user.sayHi, 1000)执行时,你只是把sayHi这个函数本身的引用传给了setTimeout,这个传递过程会把函数和user对象的关联完全切断。等1000ms后浏览器触发回调时,是直接裸调用这个函数的,没有绑定任何调用上下文,非严格模式下this会指向全局window对象,而window上没有firstName属性,自然输出undefined。 - 你误解的核心是:
this.firstName的查找根本不走词法作用域链。词法作用域管的是普通变量的查找,比如你在sayHi里直接写alert(firstName),才会顺着函数定义时的嵌套层级向外找变量。但this是函数调用时动态绑定的,它的值完全取决于函数被调用的方式,和函数在哪定义、外层词法环境有什么东西毫无关系。 - 再看包装函数的作用:setTimeout触发回调时执行的是匿名函数,匿名函数内部主动用
user.sayHi()的形式调用方法,这种「带对象前缀的方法调用」规则会自动把方法内的this绑定到前缀的user对象上,自然就能正确读取user.firstName的值了。
内容的提问来源于stack exchange,提问作者user16037629
相关产品推荐
相关产品推荐

