这是我参与「第五届青训营 」伴学笔记创作活动的第 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;
}
把函数赋给了另一个变量