一、什么是函数
函数就是可以作为一个逻辑单元对待的一组 JS 代码。使用函数可以使代码更加简洁,提高重用性。如果一段具有特定功能的程序代码需要在程序中多次使用,就可以先把它定义为函数,然后在需要这个功能的地方调用它,这样就不必多次重写这段代码。
二、函数的定义
2.1、函数声明
在 JS 中,可以使用 function 语句来定义一个函数。使用 function 语句定义函数的基本语法如下:
function 函数名([参数1,参数2,...]){
函数体;
[return 返回值;]
}
参数说明:
- 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
- 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
- 语句:必选,是函数体。用于实现函数功能的语句
- 返回值:可选,用于返回函数值。返回值可以是任意的表达式、变量或常量。
function hello(){
alert('hello world!');
console.log('hello world!');
}
使用 typeof 检查函数对象时会返回 function;
使用 function 声明的函数,都会作为 window 的方法保存;
使用函数声明创建的函数,会在其它代码执行前被创建,所以我们可以在函数声明前调用函数;
2.2、函数表达式
函数表达式语法格式如下:
函数名 = function([参数1,参数2,...]){
函数体;
[return 返回值;]
}
参数说明:
- 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
- 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
- 语句:必选,是函数体。用于实现函数功能的语句
hello = function(){
alert('hello world!');
console.log('hello world!');
}
2.3、箭头函数
箭头函数语法格式如下:
函数名 = ([参数1,参数2,...]) => {
函数体;
[return 返回值;]
}
参数说明:
- 函数名:必选,用于指定函数名。在同一个页面中,函数名必须是唯一的,并且需要区分大小写
- 参数:可选,用于指定参数列表。当使用多个参数时,参数间需要使用逗号进行分隔
- 语句:必选,是函数体。用于实现函数功能的语句
hello = () => {
alert('hello world!');
console.log('hello world!');
}
三、函数的调用
函数定义后并不会自动执行,要执行一个函数需要在特定的位置调用函数。调用函数时需要创建调用语句,调用语句包含函数名称和参数具体值。函数调用的语法如下:
函数名([传递给函数的参数1,传递给函数的参数2,...])
function hello(){
alert('hello world!');
console.log('hello world!');
}
hello();
四、函数的参数
在定义函数时,将指定的参数称为 形式参数,简称形参;而将调用函数时实际传递的值称为 实际参数,简称实参。
在 JS 中定义函数的格式如下:
function 函数名(形参1,形参2,...){
函数体;
}
定义函数时,在函数名后面的圆括号内可以指定一个或多个参数(参数之间需要用逗号“,”分隔)。指定参数的作用在于:在调用函数时,可以为被调用的函数传递一个多个值。
如果定义的函数有参数,那么调用该函数的语法格式如下:
函数名(实参1,实参2,...)
在函数中定义参数,就相当于在函数内部声明了对应的变量但是没有赋值;在定义参数时,我们还可以为参数指定默认值,默认值会在没有对应实参时生效。在定义参数时,JS 中不会检查参数的类型,因此,我们可以传递任何类型的值作为参数。
在一般情况下,在定义函数的使用了多少个形参,在函数调用时也会传递多少个实参。但是 JS 本身不会检测传递的实参个数与定义的形参个数是否相等。如果传递的实参个数小于函数定义的形参个数,JS 会自动将多余的形参的值设置为 undefined;如果传递的实参个数大于函数定义的形参个数,那么多余的实参将会被忽略。
function sum(a=0,b=0){
alert(a + ' + ' + b + ' = ' + (a+b));
console.log(a + ' + ' + b + ' = ' + (a+b));
}
sum(2,3);
五、函数的返回值
对于函数调用,既可以通过参数向函数传递数据,也可以从函数中获取数据,也就是说函数可以有返回值。在 JS 的函数中,可以使用 return 语句为函数返回一个值。在 JS 中,任何值都可以作为返回值使用。如果 return 后不跟任何值,相当于返回 undefined。如果不写 return 函数的返回值依然是 undefined。return 一执行,函数立即结束。
语法如下:
return 返回值;
这条语句的作用是结束函数,并把其后表达式的值作为函数的返回值。
function sum(a=0,b=0){
return a+b;
}
let a = 2;
let b = 3;
let result = sum(a,b);
console.log(a + ' + ' + b + ' = ' + (a+b));
如果箭头函数的函数体只有一条返回语句,箭头函数的返回值可以直接写在箭头后,例如:sum = (a,b) => a+b;
如果直接在箭头函数后设置对象字面量为返回值,对象字面量必须使用 () 括起来;
六、作用域
作用域指的是一个变量的可见区域。在 JS 中,作用域可以分为两种:全局作用域 和 块作用域;
6.1、全局作用域
全局作用域在网页运行时创建,在网页关闭时销毁。所有直接编写到 <script> 标签中的代码都位于全局作用域中。全局作用域中的变量是全局变量,可以在任意位置上访问。
let a = '全局变量';
{
console.log(a);
}
在全局中使用 var 声明的变量,都会作为 window对象的属性保存;
使用 var 声明的变量,它会在所有代码执行前被声明,所以我们可以在变量声明前就访问变量,结果为 undefined;
let 声明的变量实际上也会提升,但是在赋值之前解释器禁止访问该变量;
6.2、局部作用域
块作用域是一种局部作用域,块作用域在代码块执行时创建,代码块执行完毕它就销毁。在块作用域中声明的变量是局部变量,只能在块内部访问,外部无法访问。
{
let a = 'hello';
console.log(a);
}
函数作用域也是一种局部作用域。函数作用域在函数调用时产生,调用结束后销毁。函数每次调用都会产生一个全新的函数作用域。在函数中定义的变量是局部变量,只能在函数内部访问,外部无法访问。
function fun(){
let a = 'hello';
console.log(a);
}
fun();
var 虽然没有块作用域,但有函数作用域;
在局部作用域中,如果没有使用 var 或 let 声明变量,则变量会自动称为 window 对象的属性,也就是全局变量。
6.3、作用域链
当我们使用变量时,JS 解释器会优先在当前作用域中寻找变量,如果找到了则直接使用。如果没找到,则去上一层作用域中寻找,找到了则使用,如果没找到,则继续去上一层寻找。依次类推,如果一直到全局作用域都没有找到,则报错:Uncaught ReferenceError: xxx is not defined
。
let a = 'hello';
{
let a = 123;
console.log(a);
}
七、立即执行函数
在开发中应该尽量减少直接在全局作用域中编写代码,避免被其他人员以外修改,所以我们的代码要尽量编写在局部作用域中。如果我们使用 let 声明的变量,可以使用 {} 来创建块作用域。
立即执行函数(IIFE),是一个匿名的函数,并且它只会调用一次。可以利用立即执行函数创建一个一次性的函数作用域,避免变量冲突的问题。
// 创建一个只执行一次的匿名函数
(function(){
let a = 'hello';
console.log(a);
}());
八、函数中的this
函数在执行时,JS 解析器每次都会传递进一个隐含的参数 this。this 会指向一个对象,this 所指向的对象会根据函数调用方式的不同而不同。
- 以函数形式调用时,this 指向的是 window;
- 以方法的形式调用时,this 指向的是调用方法的对象;
通过 this 可以在方法中引用调用方法的对象。
function fun(){
console.log(this);
}
fun();
标签:function,console,函数,04,作用域,参数,hello From: https://www.cnblogs.com/nanoha/p/17058846.html箭头函数没有自己的 this,它的 this 有外层作用域决定;
箭头函数的 this 和它的调用方式无关;