目录
一、创建函数
初识函数:
函数也是一个对象,函数中可以封装一些功能(代码),在需要时可以执行这些功能(代码),函数中可以保存一些代码在需要的时候调用。
使用typeof检查一个函数对象时,会返回function
1.构造函数方法创建函数
在实际开发中很少使用构造函数来创建一个函数对象,而是使用函数声明来创建一个函数。可以将要封装的代码以字符串的形式传递给构造函数。
封装到函数中的代码不会立即执行, 函数中的代码会在函数调用的时候执行。
调用函数的语法:
函数对象()
当调用函数时,函数中封装的代码会按照顺序执行
//创建一个函数对象(构造函数方法)
//可以将要封装的代码以字符串的形式传递给构造函数
let fun = new Function("console.log('Hello,第一个函数')");
//调用函数
fun()
2.使用函数声明创建函数
使用函数声明来创造一个对象
语法:
function 函数名([形参1,形参2,...形参N]){
语句...
}
function fun2(){
console.log("第二个函数");
document.write("www")
}
//调用fun2
fun2()
3.使用函数表达式创建函数
使用函数表达式来创建一个函数(实际上也是将一个匿名函数赋值给一个变量)
语法:
let 函数名 = function([形参1,形参2,...形参N]){
语句...
}
let fun3 = function(){
console.log('第三个函数');
}
fun3();
二、函数的参数
可以在函数的()中来指定一个或多个形参(形式参数),多个形参之间使用 , 隔开 ,声明形参就相当于在函数内部声明了对应的变量。
在调用函数时,可以在()中指定实参(实际参数),实参将会赋值给函数中对应的形参
function sum(a,b){
console.log(a+b);
}
sum(123,456) //579
调用函数时解析器不会检查实参的类型,所以要注意,是否有可能会接收到非法的参数,如果有可能则需要对参数进行类型的检查。函数的实参可以是任意的数据类型.
调用函数时解析器不会检查实参的数量,多余的实参不会被赋值。如果实参的数量少于形参的数量,则没有对应实参的形参将是undefined。
三、函数的返回值
创建一个函数,用来计算三个数的和,可以使用return来设置函数的返回值
语法:
return 值
return后的值将会作为函数的执行结果来返回,可以定义一个变量,来接收该结果
在函数中,return后的语句都不会执行,如果return语句后不跟任何值就相当于返回一个undefined;如果函数中不写return,则也会返回一个undefined
return后可以跟任意类型的值
function sum(a,b,c){
let d = a + b + c
return d
}
调用函数
变量result的值就是函数的执行结果,函数返回什么result的值就是什么
let result = sum(423,12,455)
console.log("result="+result);
实参可以是任意的数据类型,也可以是一个对象,当我们的参数过多时,可以将参数封装到一个对象中,然后通过对象传播。
function sayHello(obj){
console.log(obj.name+obj.age+obj.hobby);
}
let kk = {
name:"Tom",
age:12,
hobby:"打篮球"
}
sayHello(kk)
实参可以是一个对象,也可以是一个函数
sayHello()
调用函数,相当于使用函数的返回值
sayHello
函数对象,相当于直接使用函数对象
返回值可以是任意的数据类型,也可以是一个对象,也可以是函数
立即执行函数:
函数定义完,立即被调用,这种函数叫做立即执行函数
立即执行函数往往只会执行一次
(function(){ alert("我是一个匿名函数~~") })(); (function(a,b){ console.log("a = "+a); console.log("b = "+b); })(12,23)
四、作用域
作用域指一个变量的作用的范围,在JS中一共有两种作用域,分别是全局作用域和函数作用域。
1.全局作用域
直接编写在script标签中的JS代码,都在全局作用域
全局作用域在页面打开时创建,在页面关闭时销毁
在全局作用域中有一个全局对象window,它代表的是一个浏览器的窗口,它由浏览器创建,我们可以直接使用。
在全局作用域中,创建的变量都会作为window对象的属性保存,创建的函数都会作为window对象的方法保存
全局作用域的变量都是全局变量,在页面的任意部分都能访问得到。
变量的声明提前:
使用var关键字声明的变量,会在所有的代码执行之前被声明
但是如果声明变量时不使用var关键字,则变量不会被声明提前
函数的声明提前:
使用函数声明形式创建的函数function 函数(){}
他会在所有的代码执行之前就被创建
使用函数表达式创建的函数,不会被提前声明,所以不能在声明前调用
//函数声明提前 function fun(){ console.log("hello"); }
2.函数作用域
调用函数时创建函数作用域,函数执行完毕以后,函数作用域销毁。
每调用一次函数就会创建一个新的函数作用域,它们之间是相互独立的。
在函数作用域中,可以访问到全局作用域的变量,在全局作用域中,无法访问到函数作用域的变量。
当在函数作用域操作一个变量时,它会先在自身作用域中寻找,如果有就直接使用,如果没有就向上一级作用域中寻找,直到找到全局作用域,如果全局作用域中依然没有找到,则会报错ReferenceError
在函数中要访问全局变量可以使用window对象
几个注意事项:
1.在函数作用域中也有声明提前的特性,使用var关键字声明的变量,会在函数中所有的代码执行之前被声明,函数声明也会在函数中所有的代码执行之前执行:
function fun2(){
console.log(a);
var a = 10;
function fun4(){
alert('hello')
}
}
2.在函数中不使用var声明的变量都会成为全局变量:
function fun5(){
d = 100; //相当于window.d = 100
}
fun5()
//在全局中输出d
console.log(d); //100
3.定义形参就相当于在函数作用域中声明了变量:
function fun6(e){
alert(e)
}
fun6();