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)
网友评论