JS-函数,作用域

目录

什么叫函数

函数的定义

函数的调用

函数的参数

函数体内有一个专属的关键字 return

break,continue,return区别

arguments的使用

匿名函数

自调用函数

函数是一种数据类型  //function

作用域

全局变量和局部变量

全局变量

全局变量和局部变量的区别

作用域链

预解析  (就近原则,js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)


什么叫函数

JS中可以把函数理解为一个代码容器,用于装代码; 封装一段可以被重复调用的代码块;

使用函数的目的: 让大量的代码重复使用,减轻重复编码的负担.

函数的封装: 把一个或多个功能通过函数的方式封装起来,对外提供一个借口 来调用函数;

函数的作用:   复用代码, 封装代码.


函数的定义

注:定义了一个函数,该函数不会执行,只有调用函数才会执行; 

  • 函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。

  • 函数一般都用来干一件事情,函数名称一般使用动词

  • 函数定义的方式

  1. 函数声明 :  可以在任何地方调用这个函数; 既可以在函数声明之前(函数的提升); 也可以在声明代码之后;

  • function 函数名 () {  }
  • // 定义函数
  • function 函数名  {
  •        函数体
  • }

2. 函数表达式(匿名函数):      只能在定义函数完毕之后再调用这个函数 

语法: var 变量名 = function() {}                //var 变量名 是一个变量.

// 定义函数


var 变量名  = function() {
    函数体
}

3. 构造函数式: 

语法: var 变量名 = new Function(参数1,参数2,参数3,...函数体)


// 定义函数


var fun2 = new Function('console.log(10)')


函数的调用

  • 调用函数的语法:  函数名() ;   通过函数名调用函数 ;可以调用多次(重复使用);   函数不调用;自己不执行;
//例如:
// 求1-100之间所有数的和
function getSum() {
  var sum = 0;
  for (var  i = 1; i < 101; i++) {
    sum += i;
  }
  console.log(sum);
}
// 调用
getSum();//5050


函数的参数

函数是一段代码的封装。

当函数执行的时候,函数体内的代码会执行。

我们可以传递一些数据参与运算。这个就是函数的参数。

函数的参数分为实参和形参。 实参传递给形参, 形参接受实参;

实参:函数调用的时候真实传递进去的数据,叫做实际参数,简称实参。

形参:函数定义的时候写在形参列表中的变量,叫做形式参数,简称形参。  (形参可以看做不用声明的变量, //undefined )

形参与实参的对应关系: 按照顺序,一一对应。

多个参数之间逗号隔开;

function 函数名(形参1, 形参2, 形参3...) {
  // 函数体
}

// 带参数的函数调用
函数名(实参1, 实参2, 实参3);
形参1 = 实参1
形参2 = 实参2

 var x = 5, y = 6;
fn(x,y);
function fn(a, b) {
  console.log(a + b);     //11
}

// x,y实参, 有具体的值。函数执行的时候会把x,y复制一份给函数内部的a和b,函数内部的值是复制的新值,无法修改外部的x,y


函数体内有一个专属的关键字 return

当函数执行完的时候,并不是所有时候都要把结果打印。我们期望函数给我一些反馈(比如计算的结果返回进行后续的运算),这个时候可以让函数返回一些东西。也就是返回值。函数通过return返回一个返回值.

作用:

  1. 是向函数的调用处返回一个值

  2. 终止函数的执行

//声明函数
function qiuhe(a, b) {
  var result = a + b; 
  return result; 
}
​//调用函数
var he = qiuhe(10, 20);

          

如果函数没有显示的使用 return语句 ,那么函数有默认的返回值:undefined;
如果函数使用 return语句,那么跟再return后面的值,就成了函数的返回值;
如果函数使用 return语句,但是return后面没有任何值,那么函数的返回值也是:undefined;
函数使用return语句后,这个函数会在执行完 return 语句之后停止并立即退出,也就是说return后面的所有其他代码都不会再执行。

推荐的做法是要么让函数始终都返回一个值,要么永远都不要返回值。

函数都是有返回值的
1.如果有return则返回return后面的值;

2.如果没有return则返回undefined;

3. return只能返回一个值,返回的结果是  最后逗号后的值;  

 

4.执行return语句之后,return后面的代码不再执行;


break,continue,return区别


arguments的使用

当不确定有多少个参数传递的时候,可以用arguments来获取。在JavaScript中,arguments实际上它是当前函数的一个内置对象。

所有函数都内置了一个arguments对象,arguments对象中存储了传递的所有实参。

JavaScript中,arguments是 函数的一个内置对象。

所有函数都内置了一个arguments对象.

arguments对象中存储了传递的所有的实参。

arguments是一个伪数组,可以进行遍历.


匿名函数

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

匿名函数如何使用:将匿名函数赋值给一个变量,这样就可以通过变量进行调用匿名函数自调用; == > 函数表达式

自调用函数

IIFE调用: 立即执行函数

(function () {})();
(function(){}())

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

(function () {
  alert(123);
})();


函数是一种数据类型  //function

 function fn() {}

 console.log(typeof fn);   //function

  • 函数作为参数 ==> 回调函数

因为函数也是一种类型,可以把函数作为另一个函数的参数,在另一个函数中调用; 等主函数执行完了,在执行作为参数的函数;

  • 函数做为返回值 ==> 闭包

因为函数是一种类型,所以可以把函数可以作为返回值从函数内部返回。


作用域

作用域:规定了变量函数起作用的范围。

全局变量和局部变量

全局变量

  • 在任何地方都可以访问到的变量就是全局变量,对应全局作用域;

  • <script>标签之间属于全局作用域;不同的script标签共享同一个作用域,包括js文件;
  • 在全局作用域下声明的变量叫做全局变量(在函数外部定义的变量)
  • 全局变量在代码的任何位置都可以使用
  • 在全局作用域下var声明的变量是全局变量.    var sum =  123;
  • 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)  a = 10;(不推荐)
  • 不使用var声明的变量是全局变量,不推荐使用;

局部变量

  • 只能在函数内部,访问到的变量; 对应局部作用域(函数作用域)

  • 在局部作用域下声明的变量叫做局部变量(在函数内部定义的变量)
  • 局部变量只能在该函数内部使用
  • 在函数内部var声明的变量是局部变量,函数的形参实际上就是局部变量 
  • 特殊情况下,在函数内不使用var声明的变量也是全局变量(不建议使用)  a = 10;(不推荐)

全局变量和局部变量的区别


全局变量∶在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存;


局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间;


作用域链

  • 只要是代码,就至少有一个作用域;
  • 写在函数内部的局部作用域;
  • 如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;
  • 根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链;  (就近原则, js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)

预解析  (就近原则,js中代码,从上往下执行, 只会往上找,不会向下;往上找最近的数据)

JavaScript代码的执行是由浏览器中的JavaScript解析器来执行的。

JavaScript解析器执行JavaScript代码的时候,分为两个过程:预解析过程代码执行过程

预解析过程:

  1. 变量提升: 变量的声明提升到当前作用域的最前面只会提升声明,不会提升赋值。
  2. 函数提升:函数的声明提升到当前作用域的最前面只会提升声明,不会提升调用。
  3. 先提升var,在提升function。

预解析,只会把变量的声明(不提升赋值), 函数的声明(整个函数的声明)提升; 剩下的按顺序接续书写;

(函数内部也有变量声明的提升,函数内部,没有var 的变量,直接赋值, 会变成全局变量;)


       


   


  


        


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值