函数基础、函数种类、形实参及映射
耦合:各个代码块中重复的代码太多了
编程的基本原则:高内聚、低耦合 -> 模块的单一责任制
解耦合 -> 函数
//最基本的函数写法 - 函数声明
function test(参数){
函数的执行语句;
}
函数名的命名规则
//不能数字开头
//字母_$
//包含数字
//小驼峰命名 复合单词myWonderfulTest
在函数内声明变量的时候尽量不要这样写 var a = b = 1;
可能会造成b泄漏的问题 因为这里省略了 var b;
表达式 字面量
var test=function test1(){
var a = 1,
b = 2;
console.log(a,b);
}
test1内部可见,外部不可见
var test = function(){//-> 匿名函数表达式 函数字面量
var a = 1,
b = 2;
console.log(a,b);
}
函数的组成
function 函数名 参数(可选) 返回值() return(如果没写 会自动生成)
形参和实参
形参和实参数量可不等
console.log(arguments);//可以知道实参传过来了什么值 arguments是数组
console.log(方法名.length);//可以知道形参的数量是多少
例子:一个函数被调用时,累加他的实参值
function sum()
{
var a = 0;
for(var i = 0; i < arguments.length; i++)
{
a += arguments[i];
}
console.log(a);
}
sum(1,2,3,4,5,6,7,8)
实参里面传了值得可以在函数里面去修改这个值,如果说实参里面都没有传入这个值,形参给进去修改是不会赋值上去的(简而言之就是没有分配空间)实参和形参在内存里面是存在一个映射关系的
例子:
function test(a,b){
b = 3;
console.log(arguments[1]);
}
test(1);//console.log只会打印出来undefined
//false= undefined null NaN " "0 false
形参默认值的使用//es6的写法
function test(a = 1,b){
console.log(a);
console.log(b);
}
test(undefined,2);
es6之前版本实现默认值
function test(a,b){
var a=arguments[0] || 1;
var b=arguments[1] || 2;
console.log(a + b);
}还可以用 typeof来判断是否等于undefined 或者三元运算
预编译
1.检查通篇的语法错误
1.5预编译的过程
2.解释一行,执行一行
!函数声明整体提升,变量只有声明提升,赋值是不提升的
暗示全局变量 imply global variable
var a = 1;
b = 2;
console.log(window.b);//a = window.a
//b = window.b
window = {
a:1,
b:2
}
函数预编译过程
AO activation object
活跃对象、函数上下文
1.寻找形参和变量的声明
2.实参值赋值给形参
3.找函数声明,赋值
4.执行
GO global obeject 全局上下文
1.变量
2.找函数声明
3.执行
例子:1.
var b = 3;
console.log(a);
function a(a)
{
console.log(a);
var a = 2;
console.log(a);
function a(){
var b = 5;
console.log(b);
}
}
a(1);
function test()
{
return a;
a = 1;
function a (){}
var a = 2;
}
console.log(test());
面试题
var a = false + 1;
console.log(a);//1