js-函数(闭包)

1:闭包:一个函数外加上该函数所创建时所建立的作用域。闭包的名字来源于闭包“关闭”一个函数中自由变量的访问的权利。我们所说的变量是自由的,是指该变量定义在函数外部的,而非函数内部。这个不懂。。。。如果一个函数访问了它的外部变量,那么它就是一个闭包。
2:function create(start){return function(step){start+=step;return start;}};var inc=create(5)(1);
3:闭包是一个代码执行完成后离开作用域环境依然存在的例子。这个懂。。
4:for(var i=0;i<5;i++){ (function(){return function(){return i;}result.push(i)}())};不成功的闭包。
5:var result=[];
for(var i=0;i<5;i++){
(function(){
var func=function(){
return i;
};
result.push(func)
}());
}二改,还是出来的函数。返回的数组
6:var result=[];
for(var i=0;i<5;i++){
(function(){
var pos=i;
var func=function(){
return pos;
};
result.push(func)
}());
}三改,
7:函数变量可以保存在函数的作用域内,因此看起来就好像是函数将变量包起来了。包含变量的函数就是闭包。---有权访问另一个函数作用域内变量的函数就是闭包。
8:函数声明和函数表达式。给一个函数加上括号就把他从一个声明变成了表达式。可以直接调用。
9:闭包的三个条件:访问所在的作用域,函数嵌套,在所在作用域外被调用。
10:初级阶段:function f(value){var b=value;return function(){return b;}};f('libateer')();
11:高级一点:var n;function f(){var b=1123;n=function(){return b;}};n();
12: 在高级一点:function show(first,last){var name="hello";function make(){return name+first+""+last}return make()};show("lilei","wanggua");
13:在高级一点:(function (first,last){var name="hello";function make(){return name+first+""+last}return make()})(str,str);
14:for(var i=0;i<7;i++){(function (first,last){var name="hello";function make(){return name+first+""+last}return make()})(i-100,i+100);}和上面那个差不多了吧。。
15:在在高级一点:function hello(){var name=999;return {get:function(){return name;},set:function(id){name=id;}}}var f1=hello();f1.set('lailai');f1.get();
16:找到那个怎么搞的了?function f(){var a=[];for(var i=0;i<4;i++){a[i]=function(){return i;}}return a;};var a=f();和原来出的一样现在f()函数出来的还是函数,所以要这样a1;我要取到他的函数,在把这个函数表达出来。但是现在他的值还是4.是最后的,所以要在那里吧那个替换了。var pos=i;来个这个东西。
17:闭包的经常用法:var db = (function() {
// 创建一个隐藏的object, 这个object持有一些数据
// 从外部是不能访问这个object的
var data = {};
// 创建一个函数, 这个函数提供一些访问data的数据的方法
return function(key, val) {
if (val === undefined) { return data[key] } // get
else { return data[key] = val } // set
}
// 我们可以调用这个匿名方法
// 返回这个内部函数,它是一个闭包
})();

db('x'); // 返回 undefined
db('x', 1); // 设置data['x']为1
db('x'); // 返回 1
// 我们不可能访问data这个object本身
// 但是我们可以设置它的成员
17:函数的参数和变量不会被垃圾回收机制所回收,因为他是一只被另一个函数所引用的。
18:闭包的好处:希望一个变量长期的驻扎到里面,避免全局变量的污染。
19:回到初级:function aaa(){var a=1;return function(){a++;console.log(a)}};var b=aaa()不论是这种形式,还是下面的function aaa(){var a=1;var a=function(){a++;console.log(a)};return a;};一开始都要这样:先把原函数取出来。
20:var a=(function(){var a=1;return function(){a++;console.log(a)}})();有那么点意思了,a();执行时变成了这样。、
21:用法:模块化代码,私有成员方法的存在。
22:var a=(function(){
var a=1;
function a1(){
a++;
console.log(a);
}
function a2(){
a+=3;
console.log(a+100);
}
return {
a1:a1,
a2:a2
}
})()我让他私有了。。a.a1();
23:又来了:window.onload=function(){
var Oli=document.getElementsByTagName('li');
for(var i=0;i var pos=i;
Oli[i].onclick=(function(){
console.log(pos);
})(pos);
}--改造以后for(var i=0;i

            Oli[i].onclick=(function(i){
                return function(){console.log(i)}
            })(i);
    }可以不给上面括号的加参数,但是不能不给下面的传参数。但是这个是自执行函数,不点击都会出结果。

24:(function(i){
Oli[i].onclick=function(){
console.log(i);
}
})(i)为什么变成这个就是两个都要加I而且他还不会是自执行的函数。
15:闭包注意:IE下的内存泄漏:
16:函数表达式的形式:var a=function(){console.log(a)};(function(){console.log(a)})() 函数表达式可以直接加一个()执行。
25:函数声明会被欲解析出来,如果我们想要在一些语句中实现不用的函数,一定要用函数表达式。匿名函数表达式和具名函数表达式。
26:

你可能感兴趣的:(js-函数(闭包))