JavaScript 04 函数,参数,形参,实参,返回值return,arguments的使用,冒泡排序法,匿名函数,自调用函数,作用域,作用域链,预解析

东西有点绕,需要好好消化,冒泡排序明天补上

-------------------------------------------------------------------------------------------------------

函数:封装一段特定功能的代码,然后通过函数名重复调用此段代码

定义函数 function + 函数名(参数){代码段}:function getSum( ){ }  //参数根据情况有或者没有

函数调用:getSum( );

参数:function sum(形参1,形参2){ }  //形参没有实际意义,调用函数时用来传入参数。相当于占位一样,本身没有意义

实参:sum(实参1,实参2){ } 实参就是要传入的参数,有着实际的意义。相当于传入的变量或者值 

实参传入的顺序就是挨个来,不会跳的

举例:

function sum(a,b){      //ab是形参,占用实参的位置但没有意义
  getSum = a+b;
  console.log(getSum)
}
sum(1,2)  //调用函数    //1,2是实参,替换形参在函数中的位置并执行,相当于给形参赋值a=1

实参也可传入已赋值的变量,数组等:

function sum(a,b){     
  getSum = a+b;
  console.log(getSum)
}

var x=1;

var y=2
sum(x,y)

调用的时候想当与将实参复制一份传给形参,所以改变形参的值,实参的值不会被改变

 

函数返回值 return,即函数执行完毕需要提取的东西。可以返回函数的结果。返回的结果可以用变量接收。x=getSum()  return 也可提前结束函数(函数运行到return自动结束,后面不执行),return之后也可什么都不跟,返回undefined

求1!+2!+3!+4!……n!

function getChengJi(i){
  var k = 1;
  for(m=1;m<=i;m++){
    k*=m;
  }  
  return k;
}
console.log(getChengJi(3))
function getSum(n){

  sum=0;
  for(a=1;a<=n;a++){
    sum+=getChengJi(a)
  }
return sum;
}
console.log(getSum(3))

 

arguments的使用:数组内部对象,可通过arguments获取函数调用的时候传入的实参

arguments非常像数组但不是数组  //其他的放在js高级里讲。

冒泡排序:

函数其他概念(一部分,其余在js高级中讲)

匿名函数:没有名字的函数就是匿名函数,通常将一个没有名字的函数付给一个变量。通过变量来调用匿名函数

a=function( ){ };

匿名函数还可进行自调用,即自调用函数:函数写完之后立即调用。不需要单独调用。末尾的()就相当于调用了函数

自调用:(function( ){ }) ( )  

例如:(funciton(){

  console.log("这是一个自调用函数")

})( )

自调用函数不需要单独调用,可直接运行

 

函数也是一种数据类型,即函数类型的变量:,所以函数也可当做参数传递

a=funcition(){ }

cosole.log(typeof.a)  //结果为function类型

函数当做参数传递:

var a= function(){
  console.log("我是传过来的");
}
function b(k){
  k();
}
b(a);

由于函数属于一种数据类型,所以也可被返回return      //注意,返回的要写匿名函数

function a(m){
  b=4;
  return function(){            //返回一个匿名函数
      console.log(m+b)
     }
}
s = a(3);                //给s赋的值是一个函数,输出s就是函数的代码,需要再次调用才能运行
console.log(s);      //返回匿名函数代码
s();            //调用了返回的函数

 

作用域:变量或者函数可以起作用的范围

全局作用域:在全局定义的变量在任何位置都可以访问(函数外部)

   函数内部定义变量若不用var定义,则属于全局变量!!!!!!!!!!!!! 

局部作用域:函数内部就是局部作用域。局部变量就是内部var定义的变量

  注意:function W(){var a= b = c =5;}    符合规范,但是只有a前面有var,所以只有a是局部变量,bc是全局变量

 

ES6新增块级作用域: 即{ }中的代码称为代码块,其内部单有作用域,内部变量外部无法访问

 

局部变量在函数执行完毕被销毁(内存回收),全局变量在浏览器被关闭后才会被回收

 

作用域链: 

// 全局作用域----0级作用域链
var a=5;
function f1(){
          // f1局部作用域----一级作用域链
  var a = 10;
  function f2(){
          // f2局部作用域----二级作用域链
        console.log(a);
        }
  f2();      //
}

f1();      //结果a=10  作用域先在当前域找,没有的话一层一层往外找

 

预解析:代码执行的时候都会有预解析,只有顺序不正常才会有改变

1.变量提升,把变量的声明提升到当前作用域的最上面,不包括变量的赋值

  console.log(a);    //由于预解析,所以不报错,由于只提升变量不提升变量赋值,所以输出undefined

  a= 5;      

2.函数提升,把函数的声明提升到当前作用域的最上面,不包括函数的调用

f();

function f(){ console.log(1);}  //由于预解析,提升函数声明,所以输出1

预解析案例:

var a=4;

function f(){

  console.log(a);      //由于当前作用域有a,所以预解析之后,输出undefined

  var a=2;

  console.log(a);      //a在前,所以a=2

}

f(); 

posted @ 2021-04-28 21:43  筱宇衡  阅读(67)  评论(0编辑  收藏  举报