参考资料:
http://xlaaa111.iteye.com/blog/669421
http://www.iteye.com/topic/296492
http://www.iteye.com/topic/305248
http://apps.hi.baidu.com/share/detail/8489632
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html
http://blog.belltoy.net/javascript_scope_call_object_closure.html
其中,有些地方不大理解
http://xlaaa111.iteye.com/blog/669421 写道
本段中提到了两个重要的词语:函数的定义与执行。文中提到函数的作用域是在定义函数时候就已经确定,而不是在执行的时候确定(参看步骤1和3)。用一段代码来说明这个问题:
function f(x) {
var g = function () { return x; }
return g;
}
var h = f(1);
alert(h());这段代码中变量h指向了f中的那个匿名函数(由g返回)。
假设函数h的作用域是在执行alert(h())确定的,那么此时h的作用域链是:h的活动对象->alert的活动对象->window对象。
假设函数h的作用域实在定义时确定的,就是说h指向的那个匿名函数在定义的时候就已经确定了作用域。那么在执行的时候,h的作用域链为:h的活动对象->f的活动对象->window对象。
如果第一种假设成立,那输出值就是undefined;如果第二种假设成立,输出值则为1。
运行结果证明了第2个假设是正确的,说明函数的作用域确实是在定义这个函数的时候就已经确定了。
这个地方需要注意:
http://www.iteye.com/topic/296492 写道
var scope = "global" //定义全局变量
function print() {
alert(scope);
}
function change() {
var scope = "local"; //定义局部变量
print(); //虽然是在change函数的作用域内调用print函数,
//但是print函数执行时仍旧按照它定义时的作用域起作用
}
change(); //golbal
这个例子不错,可以参考,整理下思路
http://www.iteye.com/topic/296492 写道
来看一个利用闭包来模拟私有属性的例子
function Person(name, age) {
this.getName = function() { return name; };
this.setName = function(newName) { name = newName; };
this.getAge = function() { return age; };
this.setAge = function(newAge) { age = newAge; };
}
var p1 = new Person("sdcyst",3);
alert(p1.getName()); //sdcyst
alert(p1.name); //undefined 因为Person('类')没有name属性
p1.name = "mypara" //显示的给p1添加name属性
alert(p1.getName()); //sdcyst 但是并不会改变getName方法的返回值
alert(p1.name); //mypara 显示出p1对象的name属性
p1.setName("sss"); //改变私有的"name"属性
alert(p1.getName()); //sss
alert(p1.name); //仍旧为mypara
作用域链的解释:在定义的时候就已经确定
http://www.iteye.com/topic/305248 写道
function f1(){var a=1;f2();}
function f2(){return a;}
f1();//a没有定义
先看看函数f1,调用了函数f2,因为函数局部变量a也在f1中,可能期望函数f2也访问a,但事实却不是这样。
因为这个时候f2函数已经定义完毕了,而它的范围没有a被找到。不管是函数f1还是函数f2,仅仅能访问的是本身的局部变 量或者全局变量。
不过还是不大理解作用域和执行环境,下面这两个例子就不是很理解
http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 写道
代码片段一。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
代码片段二。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());
分享到:
相关推荐
这些是理解闭包的基础。 - **作用域(Scope)**:指的是变量或者函数可以被访问的范围。 - **变量作用域**:指变量在其定义范围内可以被访问。JavaScript中有两种主要的作用域类型:全局作用域和局部作用域。 - **...
在深入理解闭包之前,我们需要先了解JavaScript的作用域规则。 1. **作用域**:在JavaScript中,变量的作用域分为两种,全局作用域和局部作用域。全局变量在整个代码中都可访问,而局部变量只在其定义的函数内部...
深入理解闭包,我们需要了解JavaScript的执行环境、活动对象、作用域和作用域链。每个函数在执行时都有一个与之关联的执行环境,其中包括一个活动对象,用于存放函数的参数、局部变量和函数声明。作用域链则是决定...
对于初学者来说,它可能显得有些抽象,但理解闭包对于提升编程技能至关重要。闭包是一种特殊的作用域,它允许函数访问并操作其外部作用域的变量,即使在外部函数执行完毕后仍然可以访问这些变量。 闭包的核心在于它...
作用域链是理解闭包的重要概念,它描述了在查找变量时,从当前作用域开始,逐级向上查找直到全局作用域的过程。在闭包的情况下,这个链还包括了闭包所关联的外部函数的作用域。因此,闭包使得函数的作用域链保持活跃...
标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。...对于初学者来说,理解闭包的原理和作用域链是非常有帮助的,而随着经验的增长,闭包会成为JavaScript编程中的一把利器。
首先,我们要理解闭包的基本结构。在Swift中,闭包表达式提供了一种简洁的方式来写闭包。它通常由三部分组成:参数列表、箭头符号(->)和闭包体。例如: ```swift { (参数类型...) in // 闭包体 } ``` 闭包可以...
了解闭包通过解释闭包所依赖的基本概念的一系列脚本来理解闭包主题目录包含 10 个脚本,涵盖了闭包功能所必需的每个主题,逐渐构建到对闭包的理解: 主题 01 - 输入 Javascript 话题 02 - Javascript 中的函数话题 ...
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
JavaScript 闭包是一种强大的特性,它允许函数访问和操作其外部作用域的变量,即使在其外部函数执行完毕后,闭包依然能...通过深入理解闭包,开发者可以更好地利用 JavaScript 的特性,写出更高效、更易于维护的代码。
标识符解析、执行环境和作用域链是理解闭包的关键部分。执行环境维护了当前代码执行的上下文,包括变量和函数的引用。每个执行环境都有一个作用域链,用于在当前环境中查找变量。作用域链是由当前执行环境加上所有...
理解闭包的关键在于掌握以下几个特点: 1. **函数嵌套**:闭包通常涉及一个函数内部定义另一个函数的情况。 2. **访问外部变量**:内部函数可以访问其外部函数的作用域中的变量。 3. **变量持久性**:通过闭包,...
首先,我们来理解闭包的定义。官方解释可能较为抽象,但简单来说,JavaScript中的每个函数都可以视为一个闭包,尤其是当一个函数内部定义了另一个函数,并且内部函数引用了外部函数的变量时,就形成了一个强大的闭包...
1. **作用域规则**:理解LEGB(Local, Enclosing, Global, Built-in)规则是理解闭包的基础。闭包可以访问定义在其外部函数的局部变量,但不能直接修改它们。 2. **闭包与匿名函数**:Python的`lambda`表达式可以...
通过理解闭包的语法、捕获列表、值传递以及内存管理,开发者可以更好地利用闭包进行复杂逻辑的实现,尤其是处理异步操作和回调时。在实际项目中,熟练掌握闭包的使用能够提高代码的可读性和维护性。
要理解闭包,首先需要了解JavaScript的作用域规则。 ##### 1.1 作用域 在JavaScript中,变量根据其声明的位置,可以分为两种类型: - **全局变量**:在整个程序中都可被访问。 - **局部变量**:只在其声明的函数...
理解闭包对于编写高效、可维护的JavaScript代码至关重要。它可以帮助你更好地控制作用域、内存和函数的生命周期,从而写出更优雅的解决方案。虽然闭包可能在初学时难以理解,但一旦掌握,它将成为你JavaScript编程的...