- A+
所属分类:Web前端
今天学习了函数,主要还是逻辑思维的锻炼,头脑要灵活。总结:多做算法题!!!????
函数以及优点 实际就是多行代码的抽取(多行代码会构成特定的功能),减少冗余代码,函数封装,提高了可维护性和可阅读性。
函数的分类 系统函数:window里面所有的函数都属于系统函数console.log(),alert(),prompy()
// 内置函数:所有的内置对象里面的函数 Math.pow()
// 自定义函数:自己定义的函数
// 内置函数和系统函数我们更关注他的使用 自定义函数(定义以及使用)
// 自定义函数的定义以及调用 // 1.使用function关键词匿名函数(没有名字的函数) /* function (形参(可省略)) { 函数体(代码) } //直接调用 */ /* (function(){ console.log('匿名函数'); })() */ // 匿名函数,声明比较少,没有复用价值 </script> <script> // 自执行的匿名函数,只执行一次,没有复用价值 (function(){ console.log('匿名函数'); })() </script> <script> // 1.使用function关键词 定义具名函数 // function函数名(形参,形参.....){ // 函数体(代码) // } // 声明 具名函数(第一种)形参是形容的参数 function sayhello(name){ console.log('hello'); } // 调用 sayhello('李四') //传进去的是实参 根据你要的参数个数来传递对应的参数 // 具名函数的变种声明 (第二种) var sayhi = function(){ console.log('hi'); } // 调用 sayhi()//这种声明,调用只能放在定义之后,因为没有赋值 // 具名函数的两种声明,调用速度来看,第一种更快 // function 和 var 在预编译阶段就会声明 // var关键词修饰的变量在预编译阶段不会赋值 // 使用new Function (new 后面的内容首字母绝对是大写的) // var 函数名 = new function函数名(‘形参,形参1’,‘函数体’) var sayBye = new Function('console.log("bye bye!!") ') sayBye() var sayBye = new Function('username','console.log("bye bye!!") ') sayBye('李四') // 在参数执行之前,有个预编译过程,他会声明对应的function和var关键词修饰的变量(开辟内存的操作) // 对应的function的内存空间开辟以后他会将对应的代码块放在其中 等待调用 // var 修饰的关键词 只会开辟一个空间 并不会进行赋值(默认给他一个undefined的值) // return 关键词 // return返回对应的数据的 他是在函数内容进行数据返回的(当你调用了return操作,后面的内容将不再执行) function sum(a,b){ return a+b; console.log('不会执行的代码'); } console.log(sum(1,2));//返回对应的a+b的值 // 如果没有return关键词,返回的一个undefined的值 function sayHi(){ console.log('hi'); } console.log(sayHi()); // 函数执行过程 // 1.方法栈 (执行栈) 把对应的开辟的function内存里面的代码丢给方法栈去执行 // 2.执行栈就会自动取执行对应的方法 执行完返回对应的结果。 // 3. function say(){ var a = 10; a++; console.log(a); } say(); say(); </script>
示例:
<script> // 阶乘计算 function compute(n) { var sum = 0; // 循环1-n for (var i = 1; i <= n; i++) { sum += i; } return sum } console.log(compute(10)); </script> <script> // 计算最小公倍数 // 方法一 function double(a, b) { if (a > b) { for (var i = 1; i <= a * b; i++) { a *= i; if (a % b == 0) { return a; } } } else { for (var i = 1; i <= a * b; i++) { b *= i; if (b % a == 0) { return b; } } } } console.log(double(12, 8)); //方法二 function fn(number1, number2) { var max = number1 > number2 ? number1 : number2 for (var i = max; i <= number1 * number2; i++) { if (i % number1 == 0 && i % number2 == 0) { return i; } } } console.log(fn(12, 8)); </script> <script> // 判断是否闰年 function year(time) { if (time % 4 == 0 && time % 100 != 0 || time % 400 == 0) { console.log('是闰年'); return; } else { console.log('不是闰年'); return; } } year(1696); </script> <script>//判断素数 方法一 var count = 0; function fn1(number) { for (var i = 1; i <= number; i++) { if (number % i == 0) count++ } if (count == 2) { console.log('素数'); } else { console.log('不是素数'); } } fn1(8) </script> <script>//判断素数 方法二 var count = 0; function fn3(number) { for (var i = 2; i < number; i++) { if (number % i == 0) { count++; break; } } if (!count) { console.log('素数'); } else { console.log('不是素数'); } } fn3(2) </script> <script> function fn4(year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { console.log('是闰年'); return; } else { console.log('不是闰年'); return; } } function checkDay(day,max){ if(day>0 && day<=max){ console.log('当前日期合法'); }else{ console.log('当前日期不合法'); } } function fn2(year,month,day){ if(month>0 && month<=12){ if(month==2){ if(fn4(year)){ checkDay(day,29); }else{ checkDay(day,28); } }else{ switch(month){ case 4: case 6: case 9: case 11: checkDay(day,30); break; default: checkDay(day,31) } } } } fn2(2007,2,30) </script>
函数的嵌套:函数的嵌套: 函数内部可以再包含其他函数; 函数之间允许相互调用,也允许向外调用, 但是不可以调用同级函数的嵌套函数;
<script> function fn1(){ console.log('函数1'); function fn2(){ console.log('函数2'); //fn3() 死循环 // fn1() 没有结果就是死循环 } function fn2(){ console.log('函数3'); // 调用函数2 fn2() } fn2() fn3() } fn1() //函数1 函数2 函数3 函数2 </script>
函数中的arguments数组
<script> // arguments是一个伪数组(有部分的数组特性)(可以通过length对应的长度[]) // 下标来访问里面的元素) function sum(){//不清楚参数个数 // 获取里面传递的所有参数 arguments 长度length var result = 0; for(var i=0;i<arguments.length;i++){ result += arguments[i] } return result; } console.log(sum(1,3,5)); console.log(sum(1,5)); console.log(sum(1,5,7,9,8)); </script> <!-- 所有的函数都具备arguments(对象) --> <!-- 访问length属性访问长度 --> <!-- []加下标(从0开始)访问里面的元素 -->
函数作用域:
<!-- <script> // 因为作用域的导致 下面找不到number var number = 2; //全局作用域 var 关键词声明的是伪全局作用域 function factorial(n){ console.log(number);//undefined number = 1;//局部变量 位于某一个代码的里面 称为全局变量 // 解决方法 变量提升 用全局变量去提升 return number; } // 作用域链 // 先往同级的地方找 找不到向上找 一直向上 直到找到为止 factorial() console.log(number); //如果外面没有声明number就找不到number(报错) // 作用域:当前一个变量的作用范围 分为局部作用域(在一个函数内或者在一个代码块内他的作用范围就是当前代码块)和全局作用域(他的作用范围是全局的) // 当前的作用域内没有找到,就会一直向上找,这个过程就叫做作用域链。 </script> --> <script> var a = 20; function fn(){ console.log(a);//20 a = 10; if(10>9){ console.log(a);//10 a =30; if(5>4){ console.log(a);//30 a = 40; if(a>10){ console.log(a);//40 } } } } fn() </script> <script> var a = 20; function fn(){ console.log(a);//20 // a = 10; if(10>9){ console.log(a);//20 // a =30; if(5>4){ console.log(a);//20 // a = 40; if(a>10){ console.log(a);//20 } } } } fn() </script> <script> var a = 20; function fn(){ console.log(a);//undefined var a = 10; if(10>9){ console.log(a);//10 var a =30; if(5>4){ console.log(a);//30 var a = 40; if(a>10){ console.log(a);//40 } } } } fn() </script>
Dom的简单操作:
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <link rel='stylesheet' href=''> </head> <body> <input id="number" type="text"> <button id="btn">判断奇数偶数</button> </body> </html> <script> function handlerClick(){ // document.getElementById('btn').onclink = function(){ // 拿到input框里面的内容 获取到input框 var inputValue = document.getElementById('number').value // console.log(typeof inputValue); // 判断 if(inputValue%2==0){ console.log('偶数'); }else{ console.log('奇数'); } } // 首先需要点击按钮 获取按键 加点击事件 // 事件触发自动调用对应的函数(事件驱动) document.getElementById('btn').onclick = handlerClick // 1.获取对应的标签(通过id获取) // document.getElementById('id的属性值') // 2.input框的值获取value属性 // document.getElementById('input框的id').value // 3.点击事件 onclink // </script>
输入搜索内容打印出来,同按钮实现:
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <link rel='stylesheet' href=''> </head> <body> <input id="number" type="text" placeholder="请输入电影名"> <button id="btn">搜索</button> <script> function handlerClick(){ // 拿到input框里面的内容 获取到input框 var search = document.getElementById('number') console.log(search.value); // 将value为空值 search.value = "" } // 首先需要点击按钮 获取按键 加点击事件 // 事件触发自动调用对应的函数(事件驱动) document.getElementById("btn").onclick = handlerClick </script> </body> </html>
今日练习!!!
<!DOCTYPE html> <html lang='en'> <head> <meta charset='UTF-8'> <meta http-equiv='X-UA-Compatible' content='IE=edge'> <meta name='viewport' content='width=device-width, initial-scale=1.0'> <title>Document</title> <link rel='stylesheet' href=''> </head> <body> <input type="text" id="number1"> <select name="" id="s"> <option value="+">+</option> <option value="-">-</option> <option value="*">*</option> <option value="/">/</option> </select> <input type="text" id="number2"> = <input type="text" id="result"> <button id="btn">计算</button> <script> // 简易计算器 function computer(){ // 获取两个输入框的值 var number1 = document.getElementById('number1').value var number2 = document.getElementById('number2').value // 获取下拉列表的值 var s = document.getElementById('s').value // 设置结果 document.getElementById('result').value = fn2(Number(number1),Number(number2),s) } document.getElementById('btn').onclick = computer </script> </body> </html> <script> function fn1() { // 遍历数组 var result =1; for(var i = 0;i<arguments.length;i++){ result *= arguments[i] } return result } console.log(fn1(1,2,3)); </script> <script> // 实现加减乘除运算 // function fn2(n1,n2){ // var sum = n1+n2; // var reduce = n1 - n2; // var product = n1*n2; // var quotient = n1/n2; // console.log('两数相加为' + sum); // console.log('两数相减为' + reduce); // console.log('两数相乘为' + product); // console.log('两数相除为' + quotient); // } // fn2(3,2) </script> <script> // 第二种方法 function fn2(number1,number2,s){ var result = 0 switch(s){ case '+': result = number1+number2 break case '-': result = number1-number2 break case '*': result = number1*number2 break case '/': result = number1/number2 break default: console.log('参数错误'); } return result } console.log(fn1(10,20,'+')); </script> <script>//写个函数实现n的阶乘 function fn3(n){ if(n==1){ return 1; }else { return fn3(n-1)*n } } console.log(fn3(3)); </script> <script>//找出0-100之间7的倍数,和包含7的数字 for(i=1;i<=100;i++){ if(i%7==0 || i%10==7 || parseInt(i/10)==7){ console.log(i); } } </script> <script>//不用循环,计算0-100以内的数字和 function fn4(n){ if(n==1){ return 1; }else{ return fn4(n-1)+n; } } console.log(fn4(100)); </script> <script>//兔子繁殖问题,设有一只新生兔子,从第四个月开始他们每个月, 月初都生一只兔子, 新生的兔子从第四个月 //月初开始又每个月生一只兔子按此规律,并假定兔子没有死亡, // n(n<=20)个月月末共有多少只兔子? function fn5(n){ if(n==1 || n==2 || n==3){ return 1; }else{ return fn5(n-1)+fn5(n-3) } } console.log(fn5(20)); </script>