js 函数
函数声明
常规函数声明可以在任何地方调用
fn1();
function fn1(){
console.log(12);
}
表达式声明,只能在声明后调用
// fn2();fn2 is not a function
var fn2 = function(){
console.log(45);
}
fn2();
函数使用
js的函数类似Java的方法,更加简化,但是它的函数名是唯一的,如果重复了就覆盖,所以不能重载
function fn3 (a,b){
console.log(a,b);
}
var a = fn3( );
function fn3(){
console.log('你好啊');
// 如果有返回值,就加return就行
return 1;
// return 终止函数运行,后面的代码不执行
// console.log("asdasdsada");
}
console.log(a);
- arguments
function m1(a,b){
// arguments是函数中的一个内置对象,保存着传递的所有参数的值
// 本质就是数组,操作和数组一样
console.log(arguments);
for (let i in arguments) {
console.log(arguments[i]);
}
}
m1(1,2,3);
变量
- let 块变量,相当于局部变量
for(let i = 0; i < 10; i++){
console.log(i);
}
console.log(i+"-------------");
- 在函数中使用var声明的变量,是局部变量,函数外不能使用,没有用var就是全局变量,但是要在函数被调用完成后还能使用
function fn4(){
var c;
console.log(c);
// 在函数中使用var声明的变量,说明是局部变量,函数外不能使用
c = 2;
// 如果没有使用var声明,则该变量是全局变量
b = 3;
}
//fn4();
// c is not defined
// console.log(c);
// 只要函数被调用了,b就是全局变量
console.log(b);
预解析
简述
预解析 会把变量和函数的声明提前,放到代码的最前面
但是变量的 = 赋值操作不会提前,必须执行到这一行才会赋值
变量和函数同名的时候,变量就不会进行预解析所以在变量声明之前,都可以调用该函数
但是变量声明之后,就无法使用该函数了,因为变量的值把函数覆盖
var1();
var var1 = 2;
function var1(){
console.log('函数');
}
// 如果调用在变量后 会解析为这样
// function var1(){
// console.log('函数');
// }
// var1();
// var1 = 2;
//从这调用会直接以2反馈
匿名函数
书写格式
( function (){console.log(2);} )();
可以把括号里的函数理解为一个变量它等于这个函数后面加();调用这个函数
把匿名函数当成一个最大的作用域,所有的代码都放到里面,可以解决命名冲突问题
闭包
操作一个函数中的局部变量,类似于java中的getter/setter方法
function m1() {
var i = 10;
function m2() {
console.log(i);
}
return m2;//m1函数返回m2函数(m2在m1里面可以操作m1里的变量)
}
var m = m1();//调用m1他直接返回m2
m();//此时m就相当于m2他可以访问m1的变量,相当于外界与函数内局部变量的一座桥梁
异常
和在Java里一样使用异常可以让我们的代码在运行异常的情况下继续向下执行
try catch
try {
console.log(a);
} catch (error) {
console.log("出错啦 : "+error.message);//返回错误信息
}finally{
console.log("必须执行");
}
console.log(1);
抛异常throw
function m1(num){
if(isNaN(num)){
throw "请输入数字";
}else{
console.log("输入的是数字");
}
}
try {
m1('a' );
} catch (error) {
console.log(error);
}
console.log(2222);