js变量提升,共享传值

关于变量提升

代码

1
2
3
4
5
6
var UserName = 'Tristana';
(function(){
console.log(UserName);
var UserName
})();
// undefined, 并没有出现 Tristana

上面代码等价于

1
2
3
4
5
6
var UserName = 'Tristana';
(function(){
var UserName
console.log(UserName);
})();
// undefined, 并没有出现 Tristana

JS运行中,会先查找作用域中的变量,并放到前面来,这对于函数也是有效的,只不过这个特征在其他语言里都有,并没有注意。

1
2
3
4
foo();
function foo(){
console.log("foo");
}

变量

1
2
3
4
5
6
7
8
9
10
var a = 'A'
b();
function b(){
var a = 'a';
log();
}
function log(){
console.log(a);
}
// 输出A,函数内变量的值与定义函数位置有关,与调用位置无关

引用传值

这是之前遇到过的,js并没有指针的概念,下面栗子却会误以为有传递的是指针

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
//栗子 1
var man = {
name:"jhin",
age:25
}
function foo(obj){
obj.age += 10;
}
foo(man);
console.log(man.age);
//栗子 2
var arr = ['Riven','Yasuo']
function foo2(obj){
obj[1]='jhin'
}
foo2(arr);
console.log(arr);
//输出 [ 'Riven', 'jhin' ]
//栗子 3
var a,b,c
function foo3(v1,v2,v3){
v1 = 'str'
v2 = 25
v3 = false
}
foo3(a,b,c);
console.log(a,b,c);
// 输出 undefined undefined undefined
// 栗子 4
var man2 = {
name:"jhin",
age:25
}
function foo4(obj){
obj = 'obj'
}
foo4(man2);
console.log(man2.age);
// 输出 25

第一个例子和第二个,对象发生变化,第三第四却没有,这涉及到一个概念:Call-by-sharing,具体内容谷歌。