ing 发表于 2020-7-8 16:11

js 为事先声明的变量赋值报错"变量已声明"??

本帖最后由 ing 于 2020-7-9 17:39 编辑

main.js,引入hello模块,调用其函数,如下

被提示module早已声明



如果我删去 const moudle = ... 再次运行成功了,这是为什么?先声明再为变量赋值反而错了??

cube 发表于 2020-7-9 16:58

运行某个模块时,会自动生成一个名称为module的对象.
所以,你const module之后,就重定义了.
因此不需要定义直接使用.
参考: https://nodejs.org/api/modules.html#modules_the_module_object

badyun 发表于 2020-7-8 22:43

因为const定义的变量不可以修改,而且必须初始化,跟var不一样

fan1191237272 发表于 2020-7-9 16:17

const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心。

ing 发表于 2020-7-9 17:34

cube 发表于 2020-7-9 16:58
运行某个模块时,会自动生成一个名称为module的对象.
所以,你const module之后,就重定义了.
因此不需要定 ...

我知道了,我在 main.js 引入 hello.js 模块,然而我 hello 模块内定义了module对象所以造成了冲突{:1_924:}

不想当咸鱼 发表于 2020-7-9 22:01

badyun 发表于 2020-7-8 22:43
因为const定义的变量不可以修改,而且必须初始化,跟var不一样

你好,我刚才在浏览器试了下,
const it = {qwe: {}}
it.qwe = {asd:'231'}
console.log(it)
可以发现能正常打印,且it = {qwe:{asd: '231'}}
所以我觉得你这种说法不太对(只是请教){:301_999:}{:301_973:}
然后试了下is = 123就会报错,这样所以我觉得应该不是const定义的变量不可修改,因为it其实是对象的地址,修改对象本身不影响,所以我觉得是前面定义的module覆盖了JS中模块化概念的module,我觉得二楼说的对,而不是常量的原因。

badyun 发表于 2020-7-9 23:08

不想当咸鱼 发表于 2020-7-9 22:01
你好,我刚才在浏览器试了下,
const it = {qwe: {}}
it.qwe = {asd:'231'}


{qwe: {}}这种是对象。而对于对象,都是引用型的,你在给对象里面赋值的时候,对象的属性变了,但他的指针没变,这种情况下是允许的。

const定义的变量不可修改这句话翻译下就是定义的值的指针不可修改
页: [1]
查看完整版本: js 为事先声明的变量赋值报错"变量已声明"??