一、命名函数与匿名函数表达式
观点:当使用了命名函数表达式以后
全局执行上下文中,不再保留着命名函数test1的变量。
但是函数执行上下文中,依然保留着命名函数test1的变量。
二、形参与实参
基本数据类型:
有实参无形参,使用全局执行上下文中没有定义的变量,会产生报错。
无实参有形参,使用形参(全局执行上下文中有定义o无定义),都是undefined。
函数上下文,更改形参,入参也会更改。 引用数据类型:
有实参无形参,使用全局执行上下文中没有定义的变量,会产生报错。
无实参有形参,使用形参(全局执行上下文中有定义o无定义),都是undefined。
更改形参内的参数,实参也会跟着改变,但是如果直接更改形参的地址,入参并不会改变! 观点:
函数的形参和入参的关系,实际上是映射的关系,并不完全是同一个东西。
// 基本数据类型 - 正常使用
var test_a = 1;
var test_b = 2;
function test(a,b) {
console.log(arguments);// 输出 arguments [1,2]
console.log(a, b)// 输出 1 2
}
test(test_a, test_b);
console.log(test_a, test_b); // 输出 1 2
// 基本数据类型 - 有形参无实参1
var a = 1;
var b = 2;
function tests(a, b) {
console.log(arguments);// 输出 arguments []
console.log(a, b);// 输出 undefined undefined
}
tests();
// 基本数据类型 - 有形参无实参2
var test1_a = 1;
var test1_b = 2;
function test1(a, b) {
console.log(arguments);// 输出 arguments []
console.log(a, b);// 输出 undefined undefined
}
test1();
console.log(test1_a, test1_b); // 输出 1 2
// 基本数据类型 - 无形参有实参
var test2_a = 1;
var test2_b = 2;
function test2() {
console.log(arguments);//// 函数内部报错,后续代码停止运行
console.log(a, b);// Uncaught ReferenceError: a is not defined
}
console.log(test2_a, test2_b);; // 输出 1 2
test2(test2_a, test2_b);
console.log(test2_a, test2_b); // 函数内部报错,后续代码停止运行
// 基本数据类型 - 有形参有实参 函数执行上下文改变形参
var test3_a = 1;
var test3_b = 2;
function test3(a, b) {
console.log(arguments);// 输出 arguments [1,2]
a = 3;
console.log(arguments);// 输出 arguments [3,2]
console.log(a, b);// 输出 3 2
}
console.log(test3_a, test3_b); // 输出 1 2
test3(test3_a, test3_b);
console.log(test3_a, test3_b); // 输出 1 2
// 引用值-正常使用
var test_arr = [1, 2, 3];
function test(arr) {
console.log(arr);// [1, 2, 3]
}
console.log(test_arr);// [1, 2, 3]
test(test_arr);
console.log(test_arr);// [1, 2, 3]
// 引用值-有形参无实参
var test1_arr = [1, 2, 3];
function test1(arr) {
console.log(arguments);//[[1,2,3]]
console.log(arr);// undefined
}
console.log(test1_arr);// [1, 2, 3]
test1();
console.log(test1_arr); // [1, 2, 3]
// 引用值-无形参有实参
var test2_arr = [1, 2, 3];
function test2() {
console.log(arguments); // 函数内部报错,后续代码停止运行
console.log(arr);// Uncaught ReferenceError: arr is not defined
}
console.log(test2_arr);// [1, 2, 3]
test1(test2_arr);
console.log(test2_arr); // 函数内部报错,后续代码停止运行
// 引用值-函数执行上下文更改形参引用值内参数
var test3_arr = [1, 2, 3];
function test3(arr) {
console.log(arguments); // [[1,2,3]]
arr.push(4);
console.log(arguments); // [[1,2,3,4]]
console.log(arr);// [1, 2, 3, 4]
}
console.log(test3_arr);// [1, 2, 3]
test3(test3_arr);
console.log(test3_arr); // [1, 2, 3, 4]
// 引用值- 直接在函数执行上下文内更改形参地址
var test4_arr = [1, 2, 3];
function test3(arr) {
console.log(arguments); // [[1,2,3]]
arr = [];
console.log(arguments); // []
console.log(arr);// []
}
console.log(test4_arr);// [1, 2, 3]
test3(test4_arr);
console.log(test4_arr); // [1, 2, 3]