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等于10,n += 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,进行++操作变成11,n ++则为自执行函数的参数20,进行++操作变成21。执行函数fn(10),参数m为20,``n += 10 + (++m)里面的n会向上层寻找找到自执行函数里面存储的变量n,此时n等于21,n += 10 + (++m)等价于n = 21+10+21 = 42,打印n会找到层级最近的,也就是自执行函数的n。所以打印出42。
obj.fn(obj.n):参数m为obj.n等于20,n += 10 + (++m)等价于n = 42 + 10 + 21 = 73,this.n里面的this指向obj对象,所以this.n +=n 是将对象里面的n变成20 + 73 = 93。打印层级最近的n为73。
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)












网友评论