函数基本概念:
1.函数声明: function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
2.函数表达式: var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
3.匿名函数: function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数表达式和函数声明不同之处:
一、Javascript引擎在解析javascript代码时会‘函数声明提升',而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式。
二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。
(function(){...})()和(function(){...}())是两种常用的立即执行函数的写法。函数体后面加括号表示立即调用,但是这个函数必须是函数表达式,不能是函数声明。
可以看出,在function前面加!、+、-甚至是逗号等都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了js引擎识别哈描述表达式和函数声明的歧义,告诉js引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行元素,有时造成不必要的麻烦。
这种写法的作用:由于js中没有私有作用域的概念,所以在开发中声明的变量很容易被覆盖,造成不必要的错误,利用这种写法,就是可以模仿一个私有的作用域,域内部可以访问域外部的变量,域外部访问不了域内部的变量。