1
var a=10;
function aaa(){
alert(a);
var a=20;
}
aaa(); //结果为:undefined
var a=10;
function aaa(a){
alert(a);
var a=20;
}
aaa(a); // 10
【第一种】
函数内部可以解析为
function aaa(){
var a;
alert(a);
a=20;
}
【第二种】
函数传入的 a 是形参,优先级高于 var a; 所以 局部变量a的声明其实被忽略了。
2
var a = {
x: 1,
y: 2
}
function foo(obj) {
obj = {
x: 2,
y: 2
}
}
foo(a)
console.log(a)
// 输出: var a = {
x: 1,
y: 2
}
var a = {
x: 1,
y: 2
}
function foo(obj) {
obj.x = 3;
obj.y = 4;
}
foo(a)
console.log(a)
// 输出: var a = {
x: 3,
y: 4
}
【第一种】
该形参是按值传递的,修改形参本身不会造成实参的修改
【第二种】
该形参是按引用传递的,形参属性所指向的地址与实参所指向的地址一样,修改形参属性就同时修改了实参的属性。
五种基本类型按值传递,对于对象而言,直接修改形参对实参没有效果,而修改形参的属性却可以同时修改实参的属性。
实参 与 形参
【形参】:是在定义函数时使用的参数,目的是用来接收调用该函数时传进来的实际参数。
【实参】:是在调用时传递给函数的参数
函数参数传递包含两种方式:值传递和引用传递。
【值传递】:形参是实参值的一个副本,对形参的改变不会影响实参
【引用传递】:形参实际上是对实参引用变量的复制,导致这实参、形参都指向同一个对象实体。形参改变会同时改变实参的值。
3
var bb1 = 1;
function aa(bb1) {
bb1 = 2;
console.log(bb1);
};
aa(bb1); //2
console.log(bb1); // 1
var bb = 1;
function aa() {
bb = 2;
console.log(bb);
};
aa(); // 2
console.log(bb); // 2
【第一种】 函数内部对 bb1 进行赋值,改变的是函数内部的 bb1 变量,不影响全局变量 bb1 ,因为在参数声明的时候,传入了bb1 这个参数,函数内默认的声明了一个 bb1 的局部变量,与函数外的 全局变量 bb1区分开来。
【第二种】 函数内部对 bb1 进行赋值,改变的是全局变量 bb1 的值。
4
var a = 10;
function aaa() {
alert(a);
};
function bbb() {
var a = 20;
aaa();
}
bbb(); // 10
var a = 10;
function aaa() {
alert(a);
};
function bbb() {
a = 20;
aaa();
}
bbb(); // 20
console.log(a); // 20
【第一种】
aaa 函数不能访问到 bbb() 里的局部变量,所以访问到的是 a=10,
【第二种】
同样,bbb 函数内部对 a 这个全局变量进行修改,因此 aaa 访问到的 全局变量就改变了