由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。
请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。
后续计划的《react进阶系列》文章也会在新公众号中推送。
公众号二维码
ar_indus由于某些原因,文章已经删除,打算迁移到别处,目前正在寻找更合适的平台。
请大家关注我的新公众号ar_indus,随后我会在公众号里推送新的博客地址。
后续计划的《react进阶系列》文章也会在新公众号中推送。
公众号二维码
ar_indus本文标题:前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作
本文链接:https://www.haomeiwen.com/subject/lcarwttx.html
网友评论
var m = 20;
function foo() {
var a = 2;
function baz(a) {
console.log(a);
}
fn = baz;
}
function bar() {
fn(m);
}
foo();
bar(); // 20
请问这样写是不是有误导别人的感觉,因为你在baz(a)这里传的a,而后面你又打印了a,后面打印的a到底是上个函数的a还是穿的参数?如果我把baz(obj)传参obj,在fn(m)传入m,那么最后打印a依然是2啊,并不是20
关于最后一个例子...
// demo07
高程里对闭包的解释是 "有权访问另一个函数作用域中的变量的函数"
就是说fn1是闭包
但根据楼主的实验 在chrome中, 有fn1是闭包 没fn1不是闭包
由此推测..
chrome对闭包的解释可能是
包含 "有权访问另一个函数作用域中的变量的函数" 的函数
就是在高程的闭包解释基础上又在外面包了一层...
我在想
有没有可能是chrome指的closure其实是指当前闭包使用到的变量和所在的函数....
个人愚见 = =
轻喷
浏览器会检测一个执行上下文中是否有引用了内部变量的函数,如果有的话,那么就会有将该执行上下文的函数就被认为是一个闭包;所以执行fn2时会foo会出现在闭包里,一旦去除fn1就没有foo闭包,说明fn1的引用内部变量的行为已经使foo被认定为闭包。
那么闭包应该是被调用执行的时候,通过识别是否内部有引用内部变量的函数来确定创建的。
1、闭包是在函数被调用执行的时候才被确认创建的
2、只有内部函数访问了上层作用域链中的变量对象时,才会形成闭包
|- 基于这两个闭包的基本特性,我认为闭包并不单单指作用域链上的某个函数,而是被调用函数及其扩展。闭包的主体或主导者是被实际调用的那个函数,保存的上层变量对象就是其扩展。
|- 在Chrome里面显示的【Closure(foo)】中,foo应该指的是当前闭包中的变量是属于foo函数对应的变量对象
②闭包是以结果导向的,最终结果的输出,过程中所涉及到的引用变量的函数。eg·demo7中fn2根本就不是闭包。他没有访问变量a。
···
function foo() {
var a = 2;
function bar() {
console.log( a ); // 2
}
bar();
}
foo();
···
闭包的定义:
**当函数可以记住并访问所在的词法作用域时, 就产生了闭包, 即使函数是在当前词法作用域之外执行。**
这是闭包吗?
技术上来讲, 也许是。 但根据前面的定义, 确切地说并不是。 我认为最准确地用来解释
bar() 对 a 的引用的方法是词法作用域的查找规则, 而这些规则只是闭包的一部分。( 但却
是非常重要的一部分! )
chrome打断点确实是closure。
波同学作何解释?
2.文章截图详细,用心了~
3.在我看来,其实chrome的理解和两本书中的理解都是一个道理,只是以chrome的显示方法可以让人更加直观的看出来形成闭包之后,哪个变量对象被保存下来而没有被垃圾回收。A(变量对象)和B(内部函数)共同组成了闭包,你说A是闭包或者B是闭包都没啥问题。
4.那为什么书中会以内部函数作为描述闭包的“点”呢,是因为A里面有B,也有C,D,E,但是只有B和A组成了闭包,那用B作为标识的点也可能更加的准确一点了。一个是让调试的人看得直观,一个是让学习的人认得准确(当然,上面说的第一点是不理解了。。。也有可能是Chrome的一个小bug)
1.在断点调试界面图下面第二行“在最左侧上方,有一排图标。”这里应该是“最右侧上方。”
2.在描述那几个图标说明的下面几个段落里的左侧应该都是右侧。
3.调试代码里的 demo05 里的示例源码倒数第二行,这里应该是 var _mark = test.mark; 否则按照示例运行,最后会报错。
最后,感谢分享。
如果去掉add和sum 属性
(function() {
var a = 10;
var b = 20;
var test = {
m: 20,
mark: function(k, j) {
return k + j;
}
}
window.test = test;
})();
var _mark = test.mark;
_mark();
运行到 return k + j; 并没有形成闭包,波老师,怎么回事呢。
(function() {
var a = 10;
var b = 20;
var test = {
m: 20,
add: function(x) {
return a + x;
},
sum: function() {
return a + b + this.m;
},
mark: function(k, j) {
return k + j;
}
}
window.test = test;
})();
var _mark = test.mark;
_mark();
运行到 return k + j; 就形成了闭包, mark不也是没有访问上层作用域的变量吗?
var a = 10;
var b = 20;
function add(x) {
return a + x;
}
function mark() {
return 2;
}
mark();
add(2);
}
pp();
这样有闭包
function pp() {
var a = 10;
var b = 20;
// function add(x) {
// return a + x;
// }
function mark() {
return 2;
}
mark();
// add(2);
}
pp();
这样就没有,这是什么毛病
下面是MDN的:
A closure is the combination of a function and the lexical environment within which that function was declared. This environment consists of any local variables that were in-scope at the time that the closure was created.
闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。
chrome的scope选项里面还有local和global。closure这个选项是指闭包创建时的作用域,closure选项展开显示的是这个作用域里面的变量。
return function fn() {
console.log(a);
}
就没有办法形成闭包了,目前已经发现了好几个类似的例子。具体规则还不清楚是什么
例如:
(function()
var a=1;
function fn1(){
return a;
}
function fn2(){
return 2;
}
)()
function fn() {
var a = 20;
function bar() {
return a;
}
bar();
}
fn();
var fn;
var m = 20;
function foo() {
var a = 2;
function baz(a) {
console.log(a);
}
fn = baz;
}
function bar() {
fn(m);
}
foo();
bar(); // 20
demo2,baz没有直接用到foo的参数,但是在他的作用域链上面应该也保存有foo的变量对象吧,那foo执行结束他的变量对象应该也不会销毁吧,这样我感觉也是是闭包吧?求波老师指点一下
mark并没有访问上层作用域链的变量吧,应该不算闭包。
所以应该是---mark执行时,没有形成闭包,this指向test?