function,arguments,预解析,作用域链

本文深入探讨了JavaScript中的函数,包括函数的声明与调用、函数表达式、参数、返回值、作用域以及预解析等核心概念。通过实例解析了函数在封装代码、避免重复和传递数据等方面的作用,还介绍了匿名函数、自调用函数以及作用域链的概念,帮助读者全面理解JavaScript函数的使用和原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先,在JS的世界中,函数是一等公民,它有着很重要的作用。而什么是函数呢,它起着函数封装,和代码重复的左右(即在代码重复过多,就可以使用函数)

创建函数:

方法一:函数声明及执行方式(推荐)

函数的声明:

function  自定义函数名() {
      //一堆代码
     具体的功能代码
      一堆代码==>函数体
      //函数体
}

注意:
     1. 由于函数是用来实现某种特定功能代码,所以一般我们设置函数名的时候,以动词开始。
     2. 函数不能自己执行代码,需要通过函数名调用实现代码的执行

函数的调用:

函数名();

例子:

function getSum(num1, num2) {
            var sum = num1 + num2;
         
            alert(sum);
        }
        var a = 2;
        var b = 3;
        getSum(a, b);

方法二:函数表达式(字面量)及执行方式

var  fn = function () {

}   
fn();

 函数的参数:

形参:

形参时指:在函数创建时,在小扩号中定义的变量。例如在上面代码中num1、num2就代表形参

形参也就是占位符,本身没有真实数据

function 函数名(形参,形参,形参...) {//形参,就是一个占位符,命名规则和规范和变量一样
    //函数体
}
注意:
      1 函数也可以做为参数进行传递

实参:

 实参,在函数调用时,在小扩号中所传入的实际的数据。例如在上面代码中的a、b就代表实参

实参:真实数据
函数名(数据,数据,数据...);   

函数:一段代码的封装

定义函数:function 函数名 (形式参数,形式参数......) {函数体}

调用函数:函数名(实际参数,实际参数......);

函数的返回值return

目的:把一个值返回到函数外面

 返回值:函数执行完后,可以把执行的结果 通过 return 语法 返回给 调用者

function add(num1,num2){  //num1 和 num2 是两个形参
	//函数体
	return num1 + num2; // 注意:return 后的代码不执行
}
var resNum = add(21,6); // 调用函数,传入 两个实参,并通过 resNum 接收函数返回值
alert(resNum);// 27

 注意:【很重要!!!!!】
    1. 如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined
    2. 如果函数中写了return语句,后面没有写任何其他内容,那么函数的返回值依然是 undefined
    3. 一个函数只能有一个返回值
    return num1,num2;//返回结果只有一个,若有多个 则返回最后一个
    4. return 代码执行完成后,后面的代码不再执行
    5. 函数也可以作为返回值(理解)

函数其他部分

arguments的使用(只有函数可以用)

 1. 如果函数参数不确定,可以定义函数的时候不写参数,通过arguments获取

 2. 如果函数的参数确定,那么推荐定义函数的时候写参数

其实是个对象,理解为数组

案例:翻转数组

function reverse() {
            var arr = [];
            for (var i = arguments.length - 1; i >= 0; i--) {
                arr[arr.length] = arguments[i];

            }
            return arr;
        }
        var a = reverse("red", "blue", "white");
        console.log(a);

匿名函数和自调用函数

 匿名函数: 没有函数名的函数

例如:
var  fn = function () {
    
}

总结:
   1. 匿名函数不能单独使用
   2. 可以将匿名函数赋值给一个变量
   3. 可以让匿名函数自己调用自己

 自调用函数: 函数封装好,立即执行。
    总结:
    1. 自调用函数可以是命名函数也可以是匿名函数
    2. ( function () {} )(); 

函数作用域及局部变量

作用域

作用域: 变量或者函数可以起作用的区域
 
 ◆ 全局作用域(全局变量)
       1, 在script标签中或者js文件中定义的变量,在任何地方都可以访问
      2,  在函数内部声明变量不使用var关键字 (不建议使用)
      
 ◆ 局部作用域(局部变量)
       1, 在函数内部定义的变量
      2, 局部变量只能在定义变量的函数中使用
      
 ◆ 块级作用域 (目前所学版本没有,新版本语义中有块级作用域)
       {
          块级作用域
       }  
       1. 本质上块级作用域中的变量在外部不能访问
      2. 但是在js中可以访问块级作用域的变量(证明js没有块级作用域)

全局作用域(全局变量)

声明在所有函数外部的变量,可以所有地方使用

案例:    

var age = 18;  
  console.log(age); //18

  function fn(){
    console.log(age)//18
  }

  fn();

局部作用域(局部变量)

声明在某个函数内部的变量或函数的形参,只能在函数内部使用

 案例:

function fn(){                     
         a = 100; //全局变量
         var b = 200;  
      }
	  
	  fn();
      console.log(a);   //100
      console.log(b);   // not defind

作用域链

当访问一个变量时,会先从本作用域中去找这个变量,若找不到则向上一级作用域中去找,依次类推,就形成了一个作用域链。

案例:

var a = 1;
    function fn1(){
        var a = 2;
        function fn2(){
            console.log(a);   //a的值2
        }
        fn2()
    }
    fn1();

 预解析:

   1. js 代码执行先执行预解析
    
    2.  先进行变量提升: 把变量声明提升到当前作用域的最上面,不包括变量的赋值
    
    3. 函数提升: 把函数声明提升到当前作用域的最上面,不包括函数的调用
    
   【预解析:变量和函数】
   【带有var的变量,把这个变量的定义语法,提到当前作用域最前面(注意:只定义不赋值)】
   【带有名字的函数,把这个函数的定义语法,提升到当前作用域最前面(注意:只定义不调用)】  

 案例:

变量预解析:

var  a  = 25;
function abc () {
    alert(a);
    var a = 10;
}

abc();
// undefined


相当于:
var a;
a =25;
function abc () {
    var a;
    alert(a);
    a = 10;
}

abc();

注意:如果函数名和变量名一样,函数优先

案例:

console.log(a)  // a() =  function
function a () {
    console.log(a);
}

var a = 1;
console.log(a); //1;

输出:ƒ a() {
            console.log(a);
        }
     1

函数预解析: 

var num = 10;
fun ();
function fun () {
    console.log( num );
    var num = 20;
}
//undefind


相当于:
var num ;
    num= 10;
fun ();
function fun () {
    var num;
    console.log( num );
    num = 20;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值