一道题加深对this的理解
function f(k){ this.m=k return this } var m = f(1) var n =f(2) console.log(m)//2 console.log(n)//window console.log(m.m)//undefined console.log(n.m)//2
这道题理解起来比较吃力,所以记录一下:
(1)在执行发f(1)的时候没有所属对象,所以自动挂载在window上面,即this指向为window,this.m = window.m = 1;
(2)将f(1)返回的this赋值给全局变量m,所得 m = this,上面所说this == window的,可以得到 m = this = window, m是全局变量,就可以得到 m = window.m = window,覆盖了第一步window.m=1;
(3)执行f(2)函数时候,它和f(1)执行时候一样,没有所属对象,自动挂载到window上面,此时返回的this = window,此时 this.m = window.m = 2,覆盖了上一步的window.m = window;
(4)将f(2)返回的this赋值给全局变量n,所以 n = window,到此代码执行结束!
如果你认可上面的执行,我们来看打印值:
(1)console.log(m) 根据上面执行,m被覆盖了2次,第三步执行后返回最终m结果为:2
(2)console.log(n) 根据上面执行,第四步执行后返回最终n结果为:window
(3)console.log(m.m) 我们已经知道m = 2,一个数字没有属性,2.m = undefined
(4)console.log(n.m) 我们知道 n =window,所以可以得到 n.m = window.m = m = 2
一些东西可能会恶心到我们,让我们怀疑,难受,但是只要你能静下心来,一点一点去理解它,它终究会成为你变强的垫脚石。