初识JS第四天

124 阅读5分钟

1.函数

  1. 计算机中的函数与数学中的函数完全不同
  2. JS中的函数可以理解为一段在程序中(当前页面中)多次出现的一段代码(多行的), 我们可以将这一段代码放在一个盒子中, 这个盒子就是函数, 方便我们后续多次使用
  3. 函数的使用:必须先定义然后在使用
  4. 定义: 声明式定义
function 函数名 (形参) {函数执行代码}

其中;function:关键字,声明这是个函数 函数名:将来调用函数时要使用,参考变量命名规范 (形参):可写,可不写 {}内部书写函数在调用时要执行的代码 赋值时定义

var 变量名(函数名) = function (形参) {函数要执行的一段代码}
  1. 调用 注意:如果函数只有定义,没有调用,函数将永远不会执行 语法:函数名() 例:
function fn () {
  console.log('调用时我将会显示')
} //声明函数
fn () //调用函数
//赋值式调用
var fn1 = function () {
  console.log('调用时我将会显示')
} //定义函数
fn1 () //调用函数

2. 函数的参数

  1. 为什么要有参数: 因为函数没有参数,函数的功能就十分固定,如果想让一个函数更加灵活,那么一定需要函数的参数 例:
function fn (){
  console.log('声明')
}
fn ()
function fn (n){
  console.log('声明n')
}
fn (1) //此时调用会在控制台输字符串 '声明1'
  1. 参数包括形参与实参, 形参:function后面的小括号内书写,书写的时候写一个变量名,在函数内部都可以使用,形参其名参考变量名的规范 实参:函数调用时的小括号内使用,作用是传递给函数的形参,给形参赋值
  2. 形参与实参的数量要一致 若形参大于实参数量,传递的时候会按照顺序依次传递给对应的形参,多余的形参没有值检验的时候会是undefined 若实参的数量大于形参,传递的时候会依次从前到后传递,多余的时候无法回到当前的参数以形参的方式使用 例:
function fn (a, b) {
  console.log('输出形参' + a,'输出形参' + b)
}
fn (1) //此时输出结果会是输出形参1,输出形参undefined
function fn1 (a, b){
  console.log(a, b)
}
fn (1,2,3) //此时输出结果为1,2
  1. 参数的默认值:就在需要书写参数的后边利用赋值号给这个形参一个默认值 注意:如果形参有对应的实参,那么默认值不会生效 注意:需要默认值的参数,一般会放在函数的最后
function fn (a, b='我是默认值') {
  console.log(a ,b)
}
fn ('我给了a')//此时输出是字符串 '我给了a' 和 '我是默认值',默认值写在谁后面就是给谁默认值的,当他的默认值是undefined时会寻找默认值

3.函数的返回

  1. 意思:函数执行后的结果
  2. 函数内部创建的变量无法在函数外使用
  3. 每一个函数内部都有一个return,这个能够决定当前函数的返回值是什么,如果没有书写那么默认返回一个undefined
  4. 如果我们需要更改函数的返回值,需要将return书写在最后
  5. 因为return具有中断函数的能力,所以必须放在最后 例:
//检验7是否为质数逻辑:
/**7 % 2 !==0
 * 7 % 3 !==0
 * 7 % 4 !==0
 * 7 % 5 !==0
 * 7 % 6 !==0
 * 
*/
function fn (num) { //函数封装
  var bol = false
  for (i = 2; i < num; i++){
    if(num % i ==0){
      bol++
      break
    }
  }
  if (bol == true) {
    return true
  } else {
    return false
  }
}
var res = fn (7) //定义变量,赋值
console.log(res) //调用打印

例2:

function fn (num) {
    var bol = 0
    for (i = 2; i < num; i++){
      if(num % i ==0){
        bol++
        break
      }
    }
    return bol === 0
 }
console.log(fn(7))

4. 函数的预解析 !!!!一定要var才有预解析这个特性

  1. 变量的预解析 规则:变量提升,其实就是在定义变量前去使用这个变量,使用var声明的变量具有变量提升的能力,在定义变量前使用变量不会报错但是值变成了undefined 例:
console.log(num) //此时控制台不会报错但是num的值就变成了undefined
var num = 1
  1. 函数的预解析 (声明式函数) 浏览器在解析代码是会将函数提升到当前作用域(当前页面)的最顶部
  2. 声明式函数与赋值式函数不同,赋值式函数走的是变量提升,而声明式函数走的是函数提升(函数预解析)
fn1() //声明式函数走的是函数的预解析
fn2() //赋值式函数走的是变量的预解析,规则不一样
function fn1() {
  console.log('我是fn1 函数')
}
var fn2 = function() {
  console.log('我是fn2 函数')
}

5. 作用域(超重要!!!!!!)

简单来说就是变量可以使用的范围,因为变量不是任何地方都可以使用的,而这个使用范围我们称之为作用域

  1. 全局作用域: 是JS中最大的一个作用域 在全局作用域中,创建的变量可以在任何地方使用 直接写在script标签中的变量我们称之为全局变量,这个作用域也叫全局作用域 在全局作用域中浏览器帮我们生成的对象(一种数据类型)叫做window我们在全局作用域中声明的变量会自动添加到window对象中
  2. 局部作用域(函数作用域) 在JS中只有函数可以创建局部作用域 特点:在局部作用域内创建的变量只能在当前作用域内使用,超过这个作用域则不能使用
  3. 尽可能地多写局部变量而不懈全局变量