前言
想码这篇博文的动力是源于刷了网易2020年正式批的前端笔试题,里面有一道涉及到关于JavaScript this的问题。
由于这道题是我瞎蒙的,所以真正的解题思路是什么样的,我想真真正正了解一下。顺便全面地了解JavaScript的this
不同环境中的this含义不一样
全局中的this
浏览器环境下
在浏览器里,在全局范围内,this
等价于window
对象。用var
声明一个变量和给this
或者window添加属性是等价的
<script>
console.log(this === window) //true
var a = 3;
console.log(this.a, window.a)//3 3
</script>
说明:在浏览器中window对象同时也是全局对象
node环境中
在node
环境里,在全局范围内,如果你用REPL
(通过执行一个js文件来运行你的代码)执行一个脚本文件,用var
声明一个变量并不会和在浏览器里面一样将这个变量添加给this
。
index.js 文件在node环境中执行
var foo = "bar";
console.log(this.foo);//undefined
但是如果你不是用REPL
执行脚本文件,而是直接执行代码,结果和在浏览器里面是一样的(神坑)
> var foo = "bar";
> this.foo
bar
> global.foo
bar
在node
环境里,用REPL运行脚本文件的时候,如果在声明变量的时候没有使用var
或者let
,这个变量会自动添加到global
对象,但是不会自动添加给this
对象。如果是直接执行代码,则会同时添加给global
和this
index.js 文件在node环境中执行
foo = "bar";
console.log(this.foo);//undefined
console.log(global.foo);//bar
函数(function)中的this
如果不是用new调用,在函数里面使用this都是指代全局范围的this。无论是浏览器环境还是node环境
<script>
testa()
function testa(){
testb()
function testb(){
console.log(this === window)//true
}
}
//在node环境下
</script>
index.js 文件在node环境中执行
foo = "bar";
function testThis () {
this.foo = "foo";
}
console.log(global.foo);//ba