function 声明提前(第一等公民)
<script>
//一旦进入作用域,var function fun(){}提前
//var 声明的 声明在前,赋值在后
test();//aaa
function test(){//声明 创建空间
alert("aaa");
}
test1();//undefined 相当于在顶部声明 var test1;但是没有赋值,所以默认为undefined
var test1 = function(){
alert("bbb");
}
test1();//bbb
</script>
按值传递
<script>
//按值传递 只是复制一个副本传递出去
var a = 2;//开辟了一个空间a
var b = a;//开辟了一个新的空间b
//a取的a的值的副本,不是本身。
//a和b是两个独立的习惯
a = 3;//对于b的值没有影响,b=2;
//区别:
var p = 2;
function test(p){
console.log(p);//2
p = 3;//此时将副本的值改为3
console.log(p);//3
}
test(p);//调用时找的是全局的p,传的是p的副本
console.log(p);//2 副本改动不会影响本身
</script>
<script>
var p = 2;
function test(){
console.log(p);//2
p = 3;
console.log(p);//3
}
test();
console.log(p);//3
</script>
按址传递
<script>
var obj = {p:1};//obj里存的是地址
var ts = obj;//相当于是把obj的地址副本给了ts
obj=null;//清空obj的地址,不影响ts
console.log(ts);//{p:1}
var obj1={p:1};
function test(n){
console.log(obj1);//obj1.p=1
n.p = 2;
}
test(obj1);
console.log(obj1);//ob1j.p=2
</script>
<script>
var obj=[1,2,3];
function test(o){
console.log(o);//把obj地址副本传进来 取值 取原来的值
o = [2,3,4];//开辟了一个局部空间把地址赋值给了o
console.log(o);//obj里的地址发生了改变
}
test(obj);//这里是把obj地址的副本传进去
console.log(obj);//按obj原地址取值
</script>