函数
函数
定义
将需要反复使用的功能代码,封装成独立的模块,这个模块就是函数.
可以控制代码区块的运行,需要调用函数才会运行里面的代码块。
其数据类型为 Function
好处
-
-
功能代码可控
分类
-
内置函数 (js给我们提供的)
-
自定义函数 (自己定义)
创建函数
1.语句定义法(在任意位置都可以调用)
function 函数名([参数]){
//功能代码
}
2.表达式定义法(只能先声明后调用)
var 函数名 = function([参数]){ //匿名函数声明
//功能代码
}
3.Function(a,b...,body) 构造函数。
Function是js内置的一个构造函数,可以创建一个函数出来。
可以有多个参数,最后一个参数是函数体(代码区块)。
var getName2 = new Function('x', 'y', "var name2='name2';console.log(name2,x+y);");
getName2(1, 2); //name2 3
* 等价于
* var getName2 = function(x,y){var name2='name2';console.log(name);}
var fun = Function('console.log(123);')
fun() //123
eval
eval() 可以把字符串作为js语句运行
eval()里面可以创建全局变量,会影响程序运行,容易造成安全隐患,一般不要使用
一般用Function() 代替eval功能,Function是在函数体执行js语句,里面创建的是局部变量,不会影响程序。
var str = "var a=100";
eval(str);
console.log(a); //100
调用函数
-
一般调用: 函数名([参数])
-
事件调用 触发事件后调用函数
参数
形式参数(形参):定义函数时所传递的参数 num1,num2
实际参数(实参): 调用函数时所传递的参数 11,22
注意:
-
参数传递: 只能将实参 传递给形参,即单向传递
-
形参只能是变量; 实参可以是变量,常量,表达式
-
实参 小于 形参的数量时,多余的形参值为undefined
-
实参 大于 形参的数量时,自动忽略多余的实参
function test (num1,num2){
var sum = num1+num2;
//console.log(num1+num2)
return sum;
}
sum = test(11,22); //两个数字
可以给参数指定默认值
function f1(width, height, name = "test") {
console.log(width, height, name);
}
f1(10, 20); //10 20 'test'
返回值
返回值 return 调用函数之后,函数执行完成后通过return可以把指定数据返回 /退出函数
函数没有写return返回值时,打印结果为undefined
function sumFn() {
console.log(123)
}
console.log(sumFn()); //undefined
直接打印函数名时 打印结果为函数本身
console.log(sumFn); //函数名 整个函数
arguments对象
只有函数才有的一个内置对象
里面存储了所有传递过来的实参 适合不明确参数个数的情况
可以按照数组的方式遍历arguments
function fn(){
// arguments[0]
// arguments.length
//console.log(arguments)
for (var i=0;i< arguments.length;i++){
console.log(arguments[i])
}
}
回调函数
函数的参数可以是任意数据类型,把一个函数作为参数传递给另外一个函数,就叫回调函数
var f3 = function (data) { //创建一个函数
console.log("callback:", data)
};
function getData(callBack) { //创建一个参数为函数类型的函数
console.log(123);
callBack(3333); // 运行callBack相当于运行的f3 等价于 f3(3333)
}
getData(f3) //callback: 3333
递归函数
递归函数,函数调用自身函数。
本质 :实现了循环
使用递归的时候需要注意,不要无效的去调用自身函数,容易造成内存溢出。
函数内部需要有条件,不能无限调用递归。
// 递归函数阶乘案例: 1*2*3*4*5....;
// 1、创建一个函数,函数需要写出想要的结果。
// 2、递归函数必须要有一个结束条件,不能无限调用。
// 3、递归函数都是从最里层开始计算
function countNum(num) {
if (num === 1) {
return 1;
}
return num * countNum(num - 1)
}
变量作用域
全局变量 : 定义在函数外面的属于全局变量
局部变量 : 定义在函数内部的属于局部变量
var a = 1;
var c = 1;
function test() {
var b = 2;
var a = 3; //重新声明了一个局部变量a
c = 3; //修改了全局变量c的值
console.log(a) //3
console.log(b) //2
console.log(c); //3
}
test();
console.log(a); //1
console.log(b); //报错 b is not defined
console.log(c); //3
闭包
闭包:函数内部返回函数
闭包的作用: 把函数内部的局部变量持久存放在内存中。
function f() {
var count = 1;
return function () {
count++;
return count;
}
}
var fb = f();
console.log(fb); //返回的函数本身
fb(); //count=2
console.log(fb()); //3
函数的属性和方法
name属性 返回函数名称
function f1() { }
console.log(f1.name); //f1
var f2 = function ftest() { }
console.log(f2.name); //ftest
var f2 = function () { }
console.log(f2.name); //f2
length属性 返回函数参数的个数
function f3(a, b, c) {
var name = "test"
};
console.log(f3.length) //3
toString()方法 把函数作为字符串返回
console.log(f3.toString()); //‘function f3(a, b, c) { var name = "test" }’
冒泡排序
function mySort(arr) {
//第一层循环 来控制冒泡需要的轮数
for (var i=0;i<arr.length-1;i++) {
//第二层循环 控制每一轮比较的次数
for(var j=0;j<arr.length-1-i ;j++){
//比较相邻两个元素的值
if (arr[j] > arr[j+1]){
//交换两个数组元素的值
var tmp = arr[j]
arr[j] = arr[j+1]
arr[j+1] = tmp
}
}
}
return arr
}
var arr = [11,22,3,1,23];
arr = mySort(arr);
console.log(arr); //[1,3,11,22,23]
浙公网安备 33010602011771号