JavaScript基础笔记2(函数)
函数:
//定义函数的两种方式
function func1() { //函数声明
console.log("qwq");
}
let func1 = function() { //函数定义
console.log("qwq");
};
//两者有细微差异,function为函数声明,let为函数定义。
//JavaScript引擎会先把全局函数声明提前(类似变量提升),这阶段为初始化阶段
//而函数定义只会在运行到此行才会执行
//由于let相当于语句,与函数声明或者C语言的函数定义相比,函数大括号后面加多加了一个分号。其实可以不加,但是建议加上。
function A() { return B(); }
function B() { return A(); }
console.log( A() ); //此例没有语法错误,但是运行时会爆栈
//用函数定义和函数声明,都不会在A函数中出现B函数未定义的报错,但是调用函数时必须调用已经定义或有全局声明的函数,否则报错
JavaScript中的函数可以当做一种特殊的值来处理,函数可以当做变量名将内容转移到另一个变量里。
console.log( func1() ); //qwq undefined 如果没有return值,函数本身的返回值就是undefined
console.log( func ); //ƒ func1() { console.log("qwq"); } 如果是输出变量名会把函数内容输出出来
let func2 = func1;
func2(); // qwq 函数名可以交换
函数名也可以当参数传入另一个函数中,JavaScript教程中的函数嵌套例子:
function ask(question, yes, no) { //这里传进去的yes和no是两个函数
if (confirm(question)) yes(); //confirm是弹出对话框,让用户选择yes或no,返回true和false的函数
else no();
}
ask(
"Do you agree?",
function() { alert("You agreed."); },
function() { alert("You canceled the execution."); } //正常工作
);
ask(
"Do you agree?",
function() { alert("You agreed."); },
"qwq" //如果点yes程序正常工作,如果点no程序会中断,以至于后面的QAQ也不会输出
);
console.log("QAQ");
箭头函数
函数其实有第三种表达形式,叫箭头函数:
let func = (arg1, arg2, ..., argN) => expression;
// “(参数)=> 语句” 是箭头函数的主要形式,若为单个语句且有具体的返回值,那么也可以作为return值来用
//如果只有一个参数,可以省略括号
//如果没有参数,括号内可以为空
//其作用相当于下面定义。
let func = function(arg1, arg2, ..., argN) {
return expression;
};
console.log(typeof (()=>"qwq") ); //function 说明本质上也是函数的一种形式
//一个例子:
let ask = ()=>alert("qwq");
console.log(typeof ask()); //undefined
//分析:ask本身是函数,alert本身也是函数,但是alert()的返回值是undefined,ask()的返回值即为=>后面的值应该也是undefined,因此输出类型也是undefined
在JavaScript中,函数作为一种很自由的数据类型,可以在代码的任意位置创建:
let age = prompt("What is your age?", 18);
let welcome = (age < 18) ?
() => alert('Hello!') :
() => alert("Greetings!"); //在三目运算符中创建箭头函数
welcome();
当函数有多条语句但是需要具体的返回值时,可以用花括号括起来加return:
let add = (a,b) => {
let res = a + b;
return res;
};
alert( add(1, 2) ); // 3
由于箭头函数的简洁性,在JavaScript中有比较高的应用价值。