函数
函数的使用
先声明函数,再调用函数
//声明函数
function 函数名(){
函数体
}
//调用函数
函数名();
函数不调用不执行
函数声明两种方式
//1. 利用关键字定义
function func(){
函数体
}
func();
function func(val){
函数体
}
func(1);
//2. 函数表达式(匿名函数)
var func= function(){
函数体
}
func();
var func= function(val){
函数体
}
func(1);
函数表达式声明方式中,func是变量名,func变量存储的值为函数 函数调用必须写在函数表达式下面
函数的参数
形参 定义函数时小括号里添加的参数 实参 调用函数时小括号里添加的参数 传参个数问题: 1.实参个数和形参个数一样,正常输出 2.实参个数大于形参个数,按形参个数取,多余的实参会被忽略 2.实参个数小于形参个数,多余的形参值为undefined,形参的默认值为undefined,相当于只声明不赋值
函数的返回值
return 终止函数,只能返回一个值,如果用逗号隔开返回多个值,只取最后一个 return 语句之后的代码不被执行 没有return 的函数,返回的时undefined
arguments的使用
不确定有多少参数时用arguments获取 arguments是JavaScript中函数的一个内置对象,所有函数都内置了一个arguments对象,存储了所有传递的实参,是一个伪数组 伪数组:可以遍历,具有length属性,按索引存储数据,不具有数组的pop、push方法
function func(){
console.log(arguments); //1 2 3
console.log(arguments.length); //3
console.log(arguments[0]); //1
}
func(1,2,3);
只有函数具有arguments对象
函数的互相调用
function func1(){
console.log(1);
func2();
}
function func2(){
console.log(2);
}
作用域
变量在某个范围内起作用和效果,减少命名冲突 es6之前分为 全局作用域和局部作用域 es6新增块级作用域 if { } for { }
全局作用域
作用于整个script标签或者整个单独的js文件 全局作用域下声明的变量叫做全局变量,在代码任何位置都能使用 在函数内部,没有声明的直接赋值的变量属于全局变量
局部作用域
也叫函数作用域,作用于函数内部 局部作用域下声明的变量叫做局部变量 函数的形参可以看作局部变量
全局变量和局部变量的执行效率
全局变量只有浏览器关闭时才会销毁,局部变量所在的代码块被执行时才被初始化,在程序执行完毕就会销毁
if(3<5){
var num=10;
}
console.log(num); //10
作用域链
内部函数访问外部函数的变量,采取的是链式查找的方式决定取哪个值
var num=10;
function func1(){
var num=20;
function func2(){
console.log(num); //20
}
}
预解析
js引擎运行分为两步:预解析和代码执行 预解析:js引擎把所有的var 和 function提升到当前作用域的最前面,分为变量预解析和函数预解析 变量预解析:也叫变量提升,把所有的变量声明提升到作用域最前面,不提升赋值 函数预解析:也叫函数提升,把所有的函数声明提升到当前作用域最前面,不调用函数 代码执行:从上到下执行
预解析案例
console.log(num);
var num=10; //undefined
//预解析过程
var num;
console.log(num);
num=10;
func();
function func(){
console.log(111); //111
}
//预解析过程
function func(){
console.log(111); //111
}
func();
func();
var func=function(){
console.log(222); //报错
}
//预解析过程
var func;
func();
func = function(){
console.log(222);
}
var num=10;
func();
function func(){
console.log(num); //undefined
var num=20;
}
//预解析过程
var num;
function func(){
var num;
console.log(num);
num=20;
}
num=10;
func();
var a=10;
func();
function func(){
var b=20;
console.log(a); //undefined
console.log(b); //20
var a=30;
}
//预解析过程
var a;
function func(){
var b;
var a;
b=20;
console.log(a); //undefined
console.log(b); //20
a=30;
}
a=10;
func();
func(); //9 9 9 9 9 报错
console.log(c);
console.log(b);
console.log(a);
function func(){
var a= b= c=9;
console.log(a);
console.log(b);
console.log(c);
}
//预解析过程
function func(){
var a;
a=9;
b=9;
c=9;
console.log(a); //9
console.log(b); //9
console.log(c); //9
}
func();
console.log(c); //9
console.log(b); //9 b c未声明赋值,为全局变量
console.log(a); //报错
|