闭包是什么?
背景:js中,无法从一个函数体外读取函数体内的变量,却可以从函数体内读取外部的变量。
2,闭包用处:
a-异步事件
b-同步事件
c-同步事件。
需求:a 执行完再执行b,再执行c
可以用个函数d把b ,c 包起来,d作为a的回调函数,
闭包语法:
1,新建一个函数体,
2,放于有所需变量的函数内部,并在新函数体内调用所需变量,
3,原函数return新建函数。
```
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
```
讲一下细节: return f2与return f2()的区别,
首先,var result =f1() result()等价于f1()(),
console.log(f1)表示打印f1这个函数体,
console.log(f1())表示打印f1的return值,因为此处return的是一函数名,并没有加()执行,所以打印f2函数体。
console.log(f1()())表示打印n //999
总之一句话f1指函数体,f1()指返回值。
再举个勉强的例子,比如,var result=f1(),其中f1体内return {}
就表示result是一个对象。
什么叫匿名函数?
我的理解是,一个没有名字的函数就叫匿名函数。跟函数的声明没关系。即函数声明方式可以转成匿名函数,函数表达式可以转成匿名函数。
简单点,凡是function(){}这种结构,并且左边没有=赋值给一个变量,或者:赋值给一个对象属性,那么就是匿名函数。所有位置的匿名函数中this都指向window(浏览器环境,node环境没测试)
细节:实验过,在全局环境下直接写function(){}会报错。同时写function(){}()也会报错,
写(function(){}())等立即执行函数体不会报错。
以上建立前提,全局环境下。
function(){}()跟(function(){})()的区别在于:
左边表示函数的调用,指向是return后面的值,
右边表示一个表达式,而不是一个函数。
此处应该有个例子的,不过我忘记我遇到的那个坑了。
匿名函数做闭包?怎么做?(ಡωಡ)
```
(function(){
var jQuery = function(selector){
return new jQuery.prototype.init(selector);
}
jQuery.prototype = {
constructor : jQuery,
init:function (selector){
var nodelist = document.querySelectorAll(selector);
for(var i = 0,len = nodelist.length;i<len;i++){
this[i] = nodelist[i];
}
this.length = len;
return this;
}
};
window.$ = window.jQuery = jQuery;
jQuery.prototype.init.prototype = jQuery.prototype;
})();
```
把jQuery挂载到window.