import是引用
require是拷贝
理论上来说,require引用的值不会再受被引用文件里面的变化而影响了,这个也确实是这样的,
// dep.js export let a = 1 setTimeout(() => a += 1, 500) // app.js import { a } from 'dep' setTimeout(function () { console.log(a) }, 1000)
该种方式使用require后 a的值不变,但是使用import的时候 a的值会改变,这符合我们对require和import的区别的印象,但是看下面这段代码
被引用文件
let a = 1; const geta = function() { console.log(a) } const seta = function(_a) { a = _a; } module.exports = { geta, seta }
引用文件
const data1 = require('./node-path/index.js')
const data2 = require('./node-path/index.js')
data1.seta("XXXXXXXXXXXx");
data2.geta();
最后我们发现a的值改变了,就是说如果你引用的是值类型,那就是完全拷贝,如果你引用的是对象,那其实还是一份引用,换句话说,你引用了geta函数,而geta函数的作用域就是他的外层,所以这本质上是一个闭包
作用域的概念:
JS权威指南指出”JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.”
js就两个独立作用域一个是window一个是函数,你一旦再函数A里面声明一个函数B,那函数B所属的作用域就是函数A