JavaScript从基础到高级
函数
函数是用来包装重复使用的代码的模块,在对象里面以及构造函数常用到
一.创建函数
1.函数声明
function obj(){ //function 函数的声明 obj函数名 ()可以填形参可以不填根据需要
//函数体 ,主要实现的代码
return 0 // return 返回值,一个函数可以没有返回值
}
2.函数表达式
var fun = function(){ //function 函数的声明 fun函数名 ()可以填形参可以不填根据需要
//函数体 ,主要实现的代码
return 0 // return 返回值,一个函数可以没有返回值
}
函数表达式的好处是会提前函数声明
3.ES6箭头函数表达式
var fun =()=>{
}
箭头函数表达式的语法比函数表达式的语法简洁 ,并且没有自己的this,arguments,super和new.target,
这些函数的表达式更适用于本来需要匿名的函数的地方,并且他们不能用作构造函数。
箭头函数没有prototype原型的属性
基本的语法
(items,value … )=>{ //语句}
(items,value … )=> function(){
} //等价于return 一个函数表达式
()=>{} //没有参数的的声明
4.使用Function构造函数
var fun = new Function('arguments[0]','arguments[1]','arguments[n]','代码段 ;return 返回值')
效率低,必须加引号,return返回值不是必须的,影响性能。
二、调用函数
函数只有在调用时才会执行函数里面的代码,不调用不执行的。
//1.函数名称() 或 变量名()
fun()
//2.通过事件调用
//obj.事件 = 函数名称 或 变量名 或 整个函数块
//3.整个函数加小括号,可以避免代码库中的函数有重名问题,且只会在运行时执行一次,一般用作初始化工作
( function () {alert('ok');} )() ;
//4.通过函数的apply或call或bind方法调用
//all() 方法使用一个指定的 this 值和单独给出的一个或多个参数来调用一个函数。(就是说可以指定谁来调用这个函数,且调用时可以传参)
fun.call(thisArg, arg1, arg2)
//thisArg:在 fun 函数运行时指定的 this 值 arg1, arg2, ... :指定的参数列表
三、函数传参
实参和形参一一对应,实参比形参少多余的形参不被赋值,也就是undefined ,如果实参数量大于形参可以考虑arguments对象来做,
arguments类似数组但又不是数组,可以记长arguments.length ,arguments.callee:返回当前函数块(就是函数本身)(匿名函数可以使用该属性实现递归调用)。
也可以将一个函数作为一个值传递,列如
var fun=function (callback){
callback()
}
function fn(){
console.log('hello world')
}
fun(fn)
四、作用域
1.全局作用域
声明在任何函数以外的数据,拥有全局作用域。
全局作用域的数据,在这条数据声明之后的任何地方都能访问和修改,且只有在页面关闭后才被删除。
2.局部作用域
函数的作用域就是局部作用域
局部作用域的数据,只能在函数内部进行访问和修改,且在函数运行以后被立即删除
局部作用域的数据:
在函数内部使用var或let声明的变量(函数内未使用var或let声明而直接赋值的变量拥有全局作用域)
函数的参数;
函数内的声明函数和函数表达式
3.作用域链
当我们调用一条数据的时候,会先在本作用域进行查找,如果找不到就向上查找父作用域,如果还是没有找到,就继续向上,一直找到全局作用域,还是找不到就报错。
if语句束缚不住var ,if里面定义var,会被提出声明