在复习apply,call,bind的时候遇到了一个作用域问题。
let name = 'noName'
let age = 18function getMyname() {console.log('my name is ' + this.name, 'and I am ' + this.age +' years old');
}getMyname()
}
在全局使用let定义变量name和age之后,运行getMyname函数。
我就想着,在全局作用域定义一个全局的属性,在调用函数时未指明this的指向那么this就是指全局。通过this.name和this.age能够获取到在全局定义的值。
但是打印出的结果如下:
my name is undefined and I am undefined years old
通过了解发现:用let和const定义变量不会将变量绑定在全局对象上,使用var或者不用变量声明符则会将变量绑定在全局对象上。
于是我继续尝试:
var name = 'noName'
var age = 18function getMyname() {console.log('my name is ' + this.name, 'and I am ' + this.age +' years old');
}getMyname()
发现在vscode上运行文件得到的依然是:my name is undefined and I am undefined years old
。我很不解,于是通过不同代码继续测试
在vscode上运行如下:
var value1 = "张三"
let value2 = "李四"
const value3 = "王五"
console.log(global.value1) // undefined
console.log(global.value2) // undefined
console.log(global.value3) // undefined
在浏览器运行代码如下:
var value1 = "张三"
let value2 = "李四"
const value3 = "王五"
console.log(global.value1) // 张三
console.log(global.value2) // undefined
console.log(global.value3) // undefined
探究发现原因:每个node.js文件都是一个独立的模块,因此在js文件下无论用var、let还是const定义的变量都不会添加到全局对象上,必须显式添加到 global 对象上才能在其他模块中访问。
涉及其他知识点:
- window对象是浏览器的全局对象;
- global 对象 是 Node.js 提供的用于存储全局变量和函数的对象,与 Node.js 的安装位置无关。