this一直是一个JS中的困扰问题,这次在跑JS精粹的代码的时候顺带发现了Node里面全局变量的问题
var x = 1;
var myObj = {
x: 2
};
myObj.func = function() {
var print = function() {
console.log("this.x is:"+this.x); //undefined
}
print();
}
myObj.func();
如果上面的这句话,跑在浏览器中,最后输出的会是 this.x is: 1
。
如果这句话跑在 Node.js 的环境中,最后输出 'this.x is: undefined`。
这都来源于JS这门语言中设计的内容:this默认绑定的是全局。我们所能想到的合理的设计,应该是this绑定于函数内部,我指的是自动绑定在函数内部。
曾经的先人是这样解决问题的var that = this
,此后内部所有的this统一用that指代即可。
事情还没有结束,于是手贱的我干脆把function这个保留字换成箭头函数
let myObj={value:5};
myObj.double=()=>{
let that=this;
let helper=()=>{
console.log(that.value);
}
helper();
}
myObj.double(); // undefined
- 以上说明,箭头函数中的this不是我们所想象的那般,此处待更。
于是乎,诞生出了新的undefined!!根据生物学实验中的对照法,我们要区别对照组和实验组,作为对照组的使用 function 保留字来做的已证是正确的,接下来看看我们的实验组
var value=88;
var myObj={value:5};
myObj.double=function(){
var helper=function(){
console.log(this.value); // undefined
console.log(this===global); // true
}
helper();
}
myObj.double();
console.log(global.value); //也就是说上方的value并不属于global
上面证明了什么呢??
- 我们在node环境下,用 var 声明的变量并没有挂载在global对象中。 (那么它会挂载哪里?会挂载那个.js文件里面。那么怎么挂在node.js里面呢?此处待更)
- 当前文件中的this确实是指向全局对象的。与我们上文所说的JS机制还是一样的,只是环境不同的,还是那个尿性。
- 经过尝试发现要这样写
global.value=4
是能够挂上去的