代码如下:
const testFunc = (str)=>{
str = 'my test str'
}
let str = ''
testFunc(str)
console.log(str)
2020年01月15日23:18:16晚上新加:
一时迷糊了,因为经常直接在函数中操作对象,当换成字符串,发现不起作用后没有反应过来。如下代码:
let a = { name: '11111', sex: 'nan' }
const setName = (param) => {
console.log(param === a)
param.name = 'test'
}
setName(a);
console.log(a)
如果把上面的setName(a)
换成setName(a.name)
、把param.name = 'test'
换成param = 'test'
,可以看到结果又不一样了。
出现上面结果的原因是没有完全理解全局作用域、函数作用域
- 当传入参数是常量的时候,对参数的更改是在函数作用域里面,并不会影响全局作用域的值。
- 当传入的参数是对象的时候,虽然函数外部是全局作用域,参数是函数作用域,但是由于对象使用的是同一块内存,当内容改变后,全局作用域里面的值和函数作用域里面的值都发生改变。
ECMAScript中所有的函数中的参数是按值传递的,函数参数传递的并不是变量的引用,而是变量的拷贝副本。
当函数参数是对象时(即引用类型,并不是单纯的一个值,而是指向该对象的堆内存中的地址而已),所以此时函数内部对对象的属性进行操作,实际上和外部变量指向堆内存中的值是相同。举个例子
let A = { a : 1, b : 2 };
let B = A
B.a = 3
那么 A.a 也等于 3
有兴趣的话楼主你可以搜索 栈内存与堆内存