//=======================函数========================
//函数就是封装了一段可以被重复使用的代码块,目的让大量代码重复使用
//函数使用分为两部 1 声明函数 2 调用函数
// function getSum(num1,num2){ //形参 形参是接受实参的
// var sum=0;
// for(var i=num1;i<=num2;i++){
// sum+=i
// }
// console.log(sum)
// }
// getSum(1,1000) //实参 /如果实参个数多余形参 会根据形参个数来运算/如果实参个数小于形参 多余的形参定义为undefiend 结果NAN
//===================返回值return==========
//函数遇到return 就把结果返回给函数的调用者 return 后面的代码不会执行 终止函数
// function getSum(num1,num2){
// var sum=0;
// for(var i=num1;i<=num2;i++){
// sum+=i
// }
// return sum
// }
// console.log(getSum(1,1000) );
//练习取出任意两数最大值
// function getMax(num1,num2){
// // if(num1>num2){
// // return num1
// // }else{
// // return num2
// // }
// return num1>num2 ? num1 : num2 //三元运算符
// }
// console.log(getMax(8,5));
//练习利用函数求任意数组中的最大数值
// function getArr(arr){
// var max = arr[0]
// for(var i = 1;i<arr.length;i++){
// if(arr[i]>max){
// max=arr[i]
// }
// }
// return max
// }
// var re = getArr([4,7,1,4,9,23,55,28])
// console.log(re);
// var num1=prompt('输入数字');
// var num2=prompt('输入数字')
// function getNum(num1,num2){
// return num1>num2 ? num1:num2
// }
// alert(getNum(num1,num2));
//=============arguments的使用==============
//Arguments是以伪数组的形式存储实参
// function getMax(){
// var max = arguments[0]
// for(var i =1;i<arguments.length;i++){
// if(arguments[i]>max){
// max=arguments[i]
// }
// }
// return max
// }
// console.log(getMax(1,2,7,3,5,9))
//利用函数封装冒泡排序
// function sort(arr){
// for(var i = 0 ;i<arr.length-1;i++){
// for(var j = 0;j<arr.length-i-1;j++){
// if(arr[j]<arr[j+1]){
// var temp = arr[j]
// arr[j]=arr[j+1]
// arr[j+1]=temp
// }
// }
// }
// return arr
// }
// var arr1= sort([1,3,5,7,9])
// console.log(arr1);
//=====================函数可以相互调用======================
// function fn1(){
// console.log(111) //1
// fn2()
// console.log('fn1') //4
// }
// function fn2(){
// console.log(222) //2
// console.log('fn2') //3
// }
// fn1()
//===============javascript作用域===============
//就是代码名字(变量)在某个范围内起作用 提高程序可靠性
//全局作用域 /局部作用域
//全局作用域 整个script标签 或则单独JS文件 比如在里面写 var num = 10 这是全局作用域
//局部作用域 在函数内部 就是局部作用域 代码名字只在函数内部起作用 比如 function fn(){var num = 20 局部作用域}
// var num =10 //全局
// console.log(num);
// function fn(){
// var num = 20 //局部
// console.log(num);
// }
// fn()
//全局变量/ 关闭浏览器才会销毁 占内存
// var num = 10 //全局变量
// console.log(num);
// function fn(){
// console.log(num) //函数内部可以使用全局变量
// }
// fn()
// 局部变量 程序结束就会销毁 节约资源
// function fun(){
// var num1 = 10 //这就是局部变量 只能在内部使用 在外部打印报错
// num2=20 //没有声明的直接赋值的变量也属于全局变量 可打印20
// }
// fun()
// console.log(num1); //报错
// console.log(num2) //20
//==============块级作用域========================
//块级作用域{} es6再写这个
//=================作用域链=========================
//内部函数访问外部函数的变量,采用链式查找方式来决定取哪个值 成为作用域链 就近原则
// var num = 10;
// function fn(){
// var num = 20;
// function fun(){
// console.log(num); //20
// }
// fun()
// }
// fn()
//=========================预解析==========================
//JS解释器运行分为两步 预解析 代码执行
//1/预解析 JS解释器会把所有的var 还有 function提升到作用域的最前面
//2/代码执行 按照代码书写顺序从上往下执行
//预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
//1/变量提升 就是把所有的变量声明提升到当前的作用域最前面 不提升赋值操作
//2/函数提升 就是把所有函数声明提升到当前作用域前 不调用函数
// var num = 10;
// fun();
// function fun(){
// console.log(num);
// var num =20
// }