[[scope]]:每一个javascript函数都是一个对象,对象中有些属性我们可以访问,但是有些不可以,这些属性仅供JavaScript引擎存取,[[scope]]就是其中一个。
[[scope]]指的就是我们所说的作用域,其中存储了运行期上下文的集合。运行期上下文:当函数执行时,会创建一个称为执行期上下文的内部对象,一个执行期上下文定义了一个函数执行时的环境,函数每次执行时对应的执行期上下文都是独一无二的,所以多次调用一个函数会导致创建多个执行期上下文,当函数执行完毕,它所产生的执行期上下文就会被销毁。
作用域链:[[scope]]中所存储的执行期上下文对象的集合,这个集合呈链式连接,我们把这种链式链接叫做作用域。
function a(){
function b(){
function c(){
}
}
}a defined a.[[scope]] ===> 0: GO
立即学习“Java免费学习笔记(深入)”;
a doing a.[[scope]] ===> 0: aAO
1:GO
b defined b.[[scope]] ===> 0: aAO
1:GO
b defined b.[[scope]] ===> 0: bAO
1:aAO
2:GO
c defined c.[[scope]] ===> 0: bAO
1:aAO
2:GO
c defined c.[[scope]] ===> 0: cAO
1:bAO
2:aAO
3:GO
当内部函数被保存到外部时,将会产生闭包,闭包会导致原有作用域链不释放,造成内存泄露。
类似智能机器人程序,以聊天对话框的界面显示,通过输入问题、或点击交谈记录中的超链接进行查询,从而获取访客需要了解的资料等信息。系统自动保留用户访问信息及操作记录。后台有详细的设置和查询模块。适用领域:无人职守的客服系统自助问答系统智能机器人开发文档、资源管理系统……基本功能:设置对话界面的显示参数设置各类展示广告根据来访次数显示不同的欢迎词整合其他程序。
4
function a(){
function b(){
var bbb = 234;
console.log(aaa);
}
var aaa = 123;
return b;
}
var glob = 100;
var demo = a();
demo();
a函数被销毁前返回了b函数,所以b函数所产生的作用域链并没有被销毁,并且此时b函数并没有被执行,在下面demo()调用的时候console.log(aaa)时,执行b函数,bAO中没有变量aaa,所以返回父级aAO中寻找到aaa = 123,故结果为123.
那么,怎样让b函数在返回之前就能够执行呢?
引入立即执行函数
立即执行函数,针对初始化功能的函数,
1.(function(){}());(w3c建议第一种)
2.(function(){})();
只有表达式才能被执行符号执行
被立即执行符号执行的函数表达式后函数不能被再次使用
可通过加号,减号等将函数转化为函数表达式
+/-/! function test(){
console.log(‘a’);
}
function test(){
var arr = [];
for(var i = 0;i < 10;i ++){
(function (j){
arr[j] = function(){
document.write(j+' ');
}
}(i));
}
return arr;
}
var myarr = test();
for(var i = 0;i < 10;i ++){
myarr[i]();
}输出结果为:1 2 3 4 5 6 7 8 9
相关文章:
相关视频:
以上就是Javascript中作用域+闭包的详细讲解的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号