函数提升(Hoisting):函数可以在声明之前调用
自调用函数、函数声明、函数表达式、匿名函数、箭头函数:
自调函数:函数后面加括号;闭包:自调函数里面有return返回函数;回调函数:典型案例:计时器(执行完外面的函数,返回执行里面的函数)
具体概念:按ctrl+f搜索
函数声明、函数表达式、匿名函数
函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
调用方式:name() 写在函数声明前后均可(具有函数提升)
函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
调用时两种方式:1.声明时直接后面加括号立即调用 2.声明后,在其后面写name()调用
匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式不同:在于,一、Javascript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。
fnName();
function fnName(){...}
//正常,因为‘提升’了函数声明,函数调用可在函数声明之前
fnName();
var fnName= function (){...}
//报错,变量fnName还未保存对函数的引用,函数调用必须在函数表达式之后
var fnName= function (){ alert('Hello World' );}();
//函数表达式后面加括号,当javascript引擎解析到此处时能立即调用函数
function fnName(){ alert( 'Hello World'); }();
//不会报错,但是javascript引擎只解析函数声明,忽略后面的括号,函数声明不会被调用
function(){ console.log('Hello World'); }();
//语法错误,虽然匿名函数属于函数表达式,但是未进行赋值操作,
//所以javascript引擎将开头的function关键字当做函数声明,报错:要求需要一个函数名
自调函数:
( function(){…} )()和( function (){…} () )是两种javascript立即执行函数的常见写法
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,明白要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明。
( function (a){ console.log(a);})(123);
//firebug输出123,使用()运算符
(function(a){ console.log(a); }(1234));
//firebug输出1234,使用()运算符
//自己的有参构造,自己直接传参
自调函数的意义(私有作用域):
私有作用域即用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。避免了你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉
函数表达式可以 "自调用"。自调用表达式会自动调用。如果表达式后面紧跟 () ,则会自动调用。不能自调用声明的函数。
以上函数实际上是一个 匿名自我调用的函数 (没有函数名)。
箭头函数、函数表达式、声明函数的区别:
// 三箭头函数
const jts = () => alert(456);
jts();//只能写在后面
const jts = () => alert(456)()//不能这样写
// 一函数表达式
var jt = function(){
alert(123);
}
jt();//只能写在后面
// 直接加括号立即调用
var jt = function(){
alert(123);
}()
// 二声明函数,只有它具有函数提升
j();//写在前后均可
function j(){
alert(888)
}
即:声明函数有函数提升功能,函数表达式有自调功能
网友评论