美文网首页
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