美文网首页
2021-03-18

2021-03-18

作者: 转移到CSDN名字丹丹的小跟班 | 来源:发表于2021-03-24 15:51 被阅读0次

    js

     let n = 10,
    obj = {n: 20} 
    let fn = obj.fn = (function() {
       this.n ++
       n ++
       return function(m) {
          n += 10 + (++m)
          this.n +=n
          console.log(n)
      }
    })(obj.n)
    fn(10)
    obj.fn(10)
    console.log(n)
    

    解析:
    fn(10):当执行到自执行函数时,直接返回一个函数,自定义函数的this指的是全局window,所以this.n++就是让全局n进行+1操作,但是n使用的是let定义,所以全局下并没有n,所以this.n ++等于NaN。而后面的n++在函数里面找不到相关变量,只能向上层寻找,最终找到全局n。所以全局n++有进行了一次加1操作,变成11。执行函数f(10)时,参数m为10,n向上找直到找到全局n, 12,所以n += 10 + (++m)等于n = 10 + 11 + 11 = 32。而this.n += n里面的this依旧指的是全局window,所以依旧为NaN,打印的时候会寻找层级最近的n,也就是let定义的n,所以打印出32。这里自执行函数的传参obj.n在函数里面并没有接收,所以并无意义。
    obj.fn(10):连续=的操作相当于将最后的值赋予前面的每个变量,例如let a = b = 10,等价于let a = 10, var b = 10(注意不同于let a = 10, b = 10这种逗号隔开其实是定义变量的简写)由上可知,let定义的n已经为32,自定义函数早已执行完毕,返回的函数里,this指向的是调用它的函数,参数m等于10n += 10 + (++m)等价于n = 32 + 10 + 11 = 53,this.n += n等价于this.n = this.n + n = 20 + 53 = 73``,所以obj.n已经等于73。打印n向上层寻找会找到let定义的n所以打印53
    console.log(n):找到全局n,打印53。

    var n = 10
    obj = {n: 20} 
    let fn = obj.fn = (function(n) {
      this.n ++
      n ++
      return function(m) {
         n += 10 + (++m)  
         this.n +=n
          console.log(n) 
       }
    })(obj.n)
    fn(10)
    obj.fn(obj.n)
    console.log(obj.n)
    

    解析:
    fn(10):先赋值给变量fn,和obj.fn一个自执行函数的返回值——一个新的函数。在自执行函数执行的过程中,this.n ++指向全局this,找到使用var定义的全局this,进行++操作变成11n ++则为自执行函数的参数20,进行++操作变成21。执行函数fn(10),参数m20,``n += 10 + (++m)里面的n会向上层寻找找到自执行函数里面存储的变量n,此时n等于21,n += 10 + (++m)等价于n = 21+10+21 = 42,打印n会找到层级最近的,也就是自执行函数的n。所以打印出42
    obj.fn(obj.n):参数mobj.n等于20,n += 10 + (++m)等价于n = 42 + 10 + 21 = 73this.n里面的this指向obj对象,所以this.n +=n 是将对象里面的n变成20 + 73 = 93。打印层级最近的n73
    console.log(obj.n):打印出93。

    let a = {n: 4}
    let b = a
    b.x = a = {n: 10}
    console.log(a.x)
    console.log(b.x)
    

    相关文章

      网友评论

          本文标题:2021-03-18

          本文链接:https://www.haomeiwen.com/subject/bglpcltx.html