// 拓展:函数优先提升 (优先级:函数>变量) // 当两种函数的定义方式同时进行定义和调用时 // 变量声明提升,无法覆盖提升的函数 fun3() // E function fun3(){ console.log('E') } var fun3 = function(){ console.log('F') } fun3() // F // ==============代码实际的运行情况============== // 预解析阶段 function fun3(){ console.log('E') } var fun3 // 运行代码 fun3() // E fun3 = function(){ console.log('F') } fun3() // F
⭕ 函数内的类数组对象:arguments
1 2 3 4 5 6 7 8 9 10 11
// 函数内arguments表示它接收到的实参列表,它是一个类数组对象 // 类数组对象:所有属性均为从0开始的自然数序列,并且有length属性,和数组类似可以用方括号书写下标访问对象的某个属性值,但是不能调用数组的方法 function fun1(){ // console.log(arguments) var sum = 0 for(var i = 0; i < arguments.length; i++){ sum += arguments[i] } console.log(sum) } fun1(1,2,3,4,5,6)
🔔 函数算法:寻找喇叭花数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 寻找喇叭花数 // 喇叭花数是这样的三位数:其每一位数字的阶乘之和恰好等于它本身。即abc=a!+b!+c!,其中abc表示一个三位数。试寻找所有喇叭花数。 // 封装阶乘的方法 functionfactorial(a) { var n = 1; for (var i = 2; i <= a; i++) { n *= i; } return n; } // 穷举寻找喇叭花数 for (var i = 100; i <= 999; i++) { var i_num1 = parseInt(i / 100); var i_num2 = parseInt((i % 100) / 10); var i_num3 = i % 10; if (i === factorial(i_num1) + factorial(i_num2) + factorial(i_num3)) { console.log(i); } }
⭕JS 内置函数 sort()方法——数组排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var arr=[33,22,55,11]; arr.sort(function(a,b){ }); // 这个函数中的a、b分别表示数组中靠前和靠后的项,如果需要将它们交换位置,则返回任意正数;否则就返回负数。
var arr=[33,22,55,11]; arr.sort(function(a,b){ if(a > b) { return 1 }else { return -1 } }); // 改写 var arr=[33,22,55,11]; arr.sort(function(a,b){ return a - b });
// 计算某个数的阶乘 //函数的功能是计算n的阶乘,n!不就是n*(n-1)!么?? function factorial(n){ //这个就是递归的出口,如果计算1的阶乘,可以不用递归了,直接返回1 if (n == 1) return 1 //如果不是1的阶乘,就返回n*(n-1)! return n * factorial(n-1) } var result = factorial(6) alert(result)
// 定义全局变量a var a = 5 function fun () { a++ console.log(a) // 6 } fun() console.log(a) // 6
局部变量:JavaScript 是函数级作用域编程语言;变量只在其定义时所在的 function 内部有意义
1 2 3 4 5 6 7
function fun () { // 在函数体内定义局部变量a var a = 5 console.log(a) // 5 } fun() console.log(a) // 报错
❗遮蔽效应
如果函数中也定义了和全局同名的变量,则函数内的变量会将全局的变量“遮蔽”
1 2 3 4 5 6 7 8 9 10
// 定义全局变量a var a = 5 function fun () { a++ // 此时a声明提升:undefined++ ==> NaN //定义局部变量 var a = 10 console.log(a) // 10 , a++的作用域在函数体内,a为局部变量,本质是函数体内的a在预解析阶段进行了变量声明提升 } fun() console.log(a) // 5
💡形参也是局部变量
1 2 3 4 5 6 7 8
// 定义全局变量a var a = 10 function fun (a) { a++ console.log(a) // 3 , 形参a是局部变量 } fun(2) console.log(a) // 10
⭕ 作用域链
函数的嵌套:一个函数内部也可以定义一个函数。和局部变量类似,定义在一个函数内部的函数是局部函数。
1 2 3 4 5 6 7
function a () { function b () { console.log('局部函数') } b() // 调用内部函数 } a() // 调用外部函数
作用域链定义:在函数嵌套中,变量会从内到外逐层寻找它的定义
1 2 3 4 5 6 7 8 9 10 11
var a = 10 var b = 20 function fun(){ var c=30 function inner(){ var a = 40 var d=50 console.log(a,b,c,d) // 变量会从内到外逐层寻找它的定义 } inner() fun()
❗不加 var 将定义全局变量
1 2 3 4 5
function fun () { a = 2 } fun() console.log(a) // 2