一.函数
基本形式:function a(){},函数在调用时才会执行。
1.函数执行方式
调用执行:a();
被动执行:document.onclick = a;(其后不加括号,事件触发时才会执行)
2.匿名函数
匿名函数要参与到表达式中,不可单独出现,否则报错。比如赋值给事件。
document.onclick = function(){
console.log(“匿名函数”)
}
若我们将一个函数赋给了事件并且给它取了名字,它是不可以被调用的,比如:
document.onclick = function aa(){
console.log("匿名函数")
}
aa(); 是会报错的
3.作用域
- 全局作用域,对应全局变量
全局变量即没被任何东西限制,直接写在script中。全局变量可以被所有的对象使用,其他对象也可访问,全局不可访问局部。 - 局部作用域,对应局部变量
局部变量可访问全局,但不可访问其他作用域的变量。局部作用域的东西不可被其他作用域的东西使用。
作用域链:使用某一变量时,先从自身作用域找,没有的话,往上一级找。
全局变量和局部变量名字可以相同,作用域可无限嵌套。调用时,具备就近原则
例1:
function x(){
let a = 2;
}
此处的x为全局变量,a为局部变量
例2:
let a = 2;
function x(){
let b = 3
}
console.log(a,b)
此处因为b是局部变量,在全局中打印,找不到b,所以会报错。
例3:
let a = 2;
function x(){
let b = 3
console.log(a,b) //此处打印2,3,可知局部可访问全局
}
x();
4.函数表达式
aa();
//函数声明,可提前调用,即可提前解析、使用
function aa(){
console.log("aa函数")
}
//函数表达式,不可提前使用。
let bb = function(){
console.log("bb函数")
}
aa();
bb();
let bb = function(){
console.log("bb函数")
}() //函数表达式可加括号自执行,因其是被赋给表达式的。这个方法不大会用
函数变函数表达式方法:
当我们在写项目时,可能会遇到词穷的时候,变量名会不够用,我们就可以用这种方式,各自开辟一些作用域,在不同作用域定义相同名字的变量也可。
(function(){
console.log("11")
})();
!function(){
console.log("11")
}();
+function(){
console.log("11")
}();
-function(){
console.log("11")
}();
~function(){
console.log("11")
}();
5.参数
参数分为形参(定义函数时规定好的变量名,作用于函数内部)和实参(调用函数时传入的实际数据),调用函数时,传参
function sum(a,b){ //此处a,b为形参
console.log(a+b)
}
sum(1,2) //此处1,2为实参
当我们不确定形实参的个数时,形参不可以一一预设好对应的变量,我们可以用arguents来显示所有实参。
function sum(){
console.log(arguments)
}
sum(1,2)
sum(1,25,7,9,)
sum(1,4,6)
sum(1,2,3,6,7)
6.返回值
一个函数执行完后,默认返回值为undefined.
function sum(x,y){
let z = x+y
}
let a = sum(2,3)
console.log(a) //打印undefined
function sum(x,y){
let z = x+y
return z
}
let a = sum(2,3)
console.log(a) //打印5
我们在写代码的时候,一般采用第二种方式,函数返回一个什么东西,使用时,直接传实参到函数中,并赋给一个变量,直接使用函数的返回值。所以我们在写注释时,要表明两个东西:
-
@params
告诉使用这个函数的re,应该传入什么实参
-
@reutrn
告诉使用这个函数的人,我会返回什么数据