概念: 函数声明 函数表达式 匿名函数 匿名函数本身也是一个闭包
闭包函数 “定义在一个函数内部的函数”
闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。
闭包函数最大用处有两个,一个是可以读取函数内部的变量,另一个是让这些变量的值始终保持在内存中。
使用闭包的注意点: 1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
1.函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
2.函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
3.匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,要在函数体后面加括号就能立即调用。
在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果。
function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
(function () {
// ...
})();
(1)标准写法
(function (window, document, undefined) {
//
})(window, document);
调用方法一:
var logMyName = function (name) {
console.log(name);
};
logMyName('李四');
调用方法二:
var logMyName = (function (name) {
console.log(name);
})('王五');
还可以这样用:
!function () {
// ...
}();
+function () {
// ...
}();
-function () {
// ...
}();
~function () {
// ...
}();