var a = {}
function b(a) {
a.name = 'ysg'
a = []
console.log(a)
}
b(a)
console.log(a)
只有变量的声明会被提升,而变量的初始化不会被提升。
// 变量提升
function c() {
console.log(cc) // undefined
var cc = 1
console.log(cc) // 1
}
因此,在函数 b 内部,a 的值是 undefined,直到它被赋值为 {}。这就是为什么在函数 b 内部,a.name = 'ysg' 这一行可以正常工作,因为 a 已经被声明,但它的值是 undefined,直到它被赋值为 {}。
参数本质上是按值传递给函数的——因此,即使函数体的代码为传递给函数的参数赋了新值,这个改变也不会反映到全局或调用该函数的代码中。
如果你将对象作为参数传递,而函数改变了这个对象的属性,这样的改变对函数外部是可见的。
函数参数相当于函数内部的局部变量,它们的值是调用函数时传递给它们的值。在函数内部对参数的修改不会影响到原始的变量,除非参数是一个对象,并且你修改了对象的属性。
上图中本地作用域中有一个变量a,全局作用域中也有一个变量a。
这张图中,本地作用域中没有变量a,全局作用域中有一个变量a,函数b中调用的是全局作用域中的变量a。