JS函数认识 | 青训营笔记

57 阅读3分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天

前言

今天学习了JS函数的初级知识,主要有:

  • 什么是JS函数,以及如何声明
  • JS参数的理解
  • 对JS作用域的理解以及对变量的划分

一. JS函数是什么?

就像其他语言的函数一样,JavaScript 函数同样是设计用于执行特定任务的代码块。

1. 不同JS函数的声明:

一般JS函数的声明:

function name(parameter1, parameter2) {
  // code to be executed
}

例如,这里定义一个计算x*y的函数,

function myFunction(x, y) { 
  return x * y;
}

也可以用函数表达式的方法来声明

var foo = function(x, y) { 
  return x * y;
}

这两者的区别是:

  • 函数声明必须有name,函数表达式则可以省略
  • 二者出现的位置不同。函数声明只能在代码的最外部或者是函数体内;函数表达式可以出现在表达式可以出现的任何地方。
  • 函数声明会被预解析,函数表达式不会

还可以用立即表达式(IIFE)的方式来声明:

(function(x,y){
    return x * y;
}(x,y) );    //执行函数

或者是new一个

const myFunction = new Function("a", "b", "return a * b");

2. 函数的参数

JS的参数规则:

  • 不指定形参的数据类型。
  • 不对实参执行类型检查。
  • 不检查接收到的实参数量。
  • 参数按值传递:函数只知道值,而不是参数的地址
  • 而对象是通过引用传递:原始值随对象属性的修改而修改

如果调用函数时实参少于形参,则缺少的值将设置为 undefined。在ES6中,允许函数参数有默认值。

function myFunction(x, y = 10) {
  return x + y;
}
myFunction(5);    //   15

用 "..." 表示将不定数量的参数视为数组


function sum(...args) { 
  let sum = 0;  
  for (let arg of args) sum += arg;  
  return sum;  
}  
  
let x = sum(1,2,3,4,5);    // 15

二. 作用域与变量

作用域决定了变量的可访问性,JavaScript 有 3 种作用域

  • (Block scope)-块作用域,由ES6后的let 和 const提供,这意味着不能从花括号之外访问它们
  • (Function scope)-函数作用域
  • (Global scope)-全局作用域

用关键字声明的变量var不能有块作用域,可以从{}外访问。

{
  let x = 2;
}
// 不能访问x

{
  var y = 3;
}
// 可以访问y

在JS函数中声明的变量,将成为函数的局部变量

  • 局部变量具有函数作用域,它们只能从函数内部访问
  • 同名的变量可以在不同的函数中使用,因为它们只在各自的函数内部才被识别
  • 局部变量在函数启动时创建,并在函数完成时删除。

在函数外部声明的变量,将成为全局变量,具有全局作用域:网页上的所有脚本和函数以及程序的任意位置都可以访问。

如果把值赋给尚未声明的变量,该变量将被自动升为全局变量。 但在“严格模式”下,未声明的变量不会自动升为全局变量。

myFunction();

function myFunction() { 
  carName = "Volvo";    // 全局
}

变量的生命周期;

  • JavaScript 变量的生命周期从声明时开始。
  • 函数变量(局部变量)在函数完成时被删除。
  • 在网络浏览器中,当您关闭浏览器窗口(或选项卡)时,全局变量将被删除。

三. 函数也是变量

在 JavaScript 中,对象和函数也是变量,在使用函数表达式来声明函数时也可以看出这一点

var foo = function(x, y) { 
  return x * y;
}

把函数赋给了另一个变量