javaScript作用域提升&基本类型&引用类型

79 阅读1分钟

看代码输出:

1.
function test(a){
  a=a+10;
}
var a=10;
test(a);
console.log(a);

输出:10

2.
function test(){
  a=a+10;
}
var a=10;
test(a);
console.log(a);

输出:20

3
function f(x) {
  console.log(x);
  var x = 200;
  console.log(x);
  }
f(a = 100);
console.log(a);

输出:100 200 100

知识点:
  • 变量a为number类型,属于基本数据类型,基本数据类型在传参时,通过拷贝值进行传递。因此,在函数内部修改形参时,不会对实参产生影响
  • 如果没有以参数的形式传入函数内,函数体内的变量a又没有使用var声明,这时候就会暴露为全局变量,第二题输出20
  • 函数参数传递的是值,而不是逻辑,f(a=100),相当于 var a=100; f(a);
  • 但是如果是修改的一个引用类型,又没有var声明,不管你是参数的形式传入,还是没有参数直接修改,都会改变。
function test(obj){
  obj.c=8;
}
var obj= {c:9};
test(obj);
console.log(obj); // {c:8}


function test(){
  obj.c=8;
}
var obj= {c:9};
test(obj);
console.log(obj); // {c:8}