欢迎光临散文网 会员登陆 & 注册

关于变量赋值过程、自执行函数、作用域、this指向的个坑:

2021-03-16 19:22 作者:刂C刂C刂  | 我要投稿


执行报错:obj is undefined 

原因在于:对象obj 中的 fn 属性值为一个立即执行函数。将obj的值指向obj这个变量 完成赋值,是在立即执行函数执行之后。

修改传入的实参为 n
输出结果

// 代码执行过程:
1.变量提升,赋值。
2.obj完成赋值前,立即执行函数执行。
    2.1 立即执行函数变量提升,产生一个私有的局部变量 n。
    2.2 立即执行函数的作用域为 window,传入的实参值为全局变量n=1。
    2.3 私有变量n = 3*1;
    2.4 this.n 指向全局作用域,全局作用域下的n变为:4。
    2.5 变量重复定义,私有变量n = 5。
    2.6 n=5 this.n=4。
    2.7 将这个函数作为值,返回给obj中的fn属性。  

3.变量赋值完成,执行后面的代码
3.1 fn(3),函数没有n,向上级作用域查找,n=5。 fn()在全局作用域下执行,所以this指向全局作用域,this.n=4。 `console.log(m+(++n)) => 自增运算符,此时私有n = 6`

        输出结果为:5 4 9  
   

3.2 fn(3),函数没有n,向上级作用域查找,n=6。 obj调用的fn(),所以this指向obj,this.n=2。
        输出结果为:6 2 10
   

3.4 输出结果为:4 2   


这道题主要考查的有:

      变量赋值的过程:(1)声明变量 (2)开辟内存空间存储值  (3)将值指向变量。

      this的指向: 浏览器环境下,谁调用就指向谁。没有调用基本就指向window,比如自执行函数、setTimeout 这些window下的方法。

       闭包:在3.1中,由于作用域链的关系,私有作用域的值并没有销毁。

关于变量赋值过程、自执行函数、作用域、this指向的个坑:的评论 (共 条)

分享到微博请遵守国家法律