延迟绑定
Python闭包函数所引用的外部自由变量是延迟绑定的。
In [2]: def multipliers():
...: return [lambda x: i * x for i in range(4)]
In [3]: print [m(2) for m in multipliers()]
[6, 6, 6, 6]
如以上代码: i是闭包函数引用的外部作用域的自由变量, 只有在内部函数被调用的时候才会搜索变量i的值, 由于循环已结束, i指向最终值3, 所以各函数调用都得到了相同的结果。
解决方法:
1) 生成闭包函数的时候立即绑定(使用函数形参的默认值):
In [5]: def multip继续阅读 »
闭包是js中一个难懂又必须征服的概念,他的形成与变量作用域以及变量的生存周期密切相关。
变量作用域和生存周期
作用域,按字面理解,就是指变量的有效范围,超出这个范围就无法访问。
在函数中,里面函数可以访问外面的变量,但是外面无法访问内部变量。举个简单例子:
var a = 1;
var fun1 = function() {
var b = 2;
var fun2 = function() {
var c = 3;
alert(b); //2
alert(c); //3
}
fun2();
alert(c); //c is not de继续阅读 »
定义函数有两种方式:函数声明和函数表达式。它们之间一个重要的区别是函数提升。
1.函数声明会进行函数提升,所以函数调用在函数声明之前也不会报错:
```
test();
function test(){
alert(1);
}
```
2.函数表达式不会进行函数提升,函数调用在函数声明之前的话会报错:
```
test(); // test is not a function
var test=function(){
alert(1);
}
```
递归函数是通过在函数内部调用自身实现的。
直接使用函数名进行递归调用
```
function f(num){
if(num==1){
r继续阅读 »
Closures are functions that refer to independent (free) variables
闭包是静态方式/词法方式进行存储所有父作用域的一个函数
在 JavaScript 高级程序设计里面通过一个createComparisonFunction()函数和这个函数的作用域链之间的关系图说得很明白为什么闭包可以访问外部函数的变量,是因为闭包的作用域链不仅包括自己本地的活动对象,还包括外部函数作用域链所指向的活动对象继续阅读 »
在过去,内存泄漏并没有为 Web 开发人员带来巨大的问题。页面保持着相对简单,并且在页面之间的跳转时可以释放内存资源,即便还存在内存泄露,那也是小到可以被忽略。
现在,新的 Web 应用达到更高的水准,页面可能运行数小时而不跳转,通过 Web 服务动态检索和更新页面。JavaScript 语言特性也被发挥到极致,通过复杂的事件绑定、面向对象和闭包等特性构成了整个 Web 应用。面对这些变化,内存泄露问题变得越来越突出,尤其是之前那些通过刷新(导航)隐藏的内存泄露问题。
庆幸的是,如果你知道如何排查问题,内存泄露可以很轻易地被清除。即便是面对一些最麻烦的问题,如果你知道解决方案,也只需要少量的工作。虽然页面仍可能存在一些小的内存泄继续阅读 »