JS 之作用域链和闭包
1.JS无块级作用域
<script>
function Main(){
if (1==1){
var name = "alex";
}
console.log(name);
}
Main();
</script>
执行结果:{}即块级作用域。
alex
2.JS采用函数作为作用域链
<script>
function Main(){
var innerValue = "alex";
} Main();
console.log(innerValue);
</script>
执行结果:
Uncaught ReferenceError: innerValue is not defined
3.JS的作用域链在创建前已经生成了
示例一:
<script>
xo = "alex";
function Func(){
var xo = "seven";
function inner(){
console.log(xo);
}
return inner;
}
var ret = Func();
ret();
</script>
执行结果:生成的作用域链为 xo("alex")----xo("undefined")----xo(使用作用域链)
seven
示例二:
<script>
xo = "alex";
function Func(){
var xo = "eric";
function inner(){
console.log(xo);
}
xo = "seven";
return inner;
}
var ret = Func();
ret();
</script>
执行结果:生成的作用域链xo("alex")----xo("undefined")----xo("undefined")----Func[xo]("eric")----Func[xo]("seven")----inner()
seven
示例三:
<script>
xo = "alex"; function Bar(){
console.log(xo);
} function Func(){
var xo = "seven";
return Bar;
} var ret = Func();
ret();
</script>
执行结果:作用域链分为二段:1.xo("alex")----xo
2.xo("alex")----xo("undefined")----Func[xo]("seven")
alex
闭包:如果每个下载的JS都有自定义的全局变量,那么在导入的时候就会发生相互覆盖的现象,通过闭包可以将变量锁定在函数内。
(function(){
var a = 123;
function f1(){
console.log(a);
}
function f2(){
cocnsole.log(a);
}
})();
面向对象JS
<script>
function Foo(name,age){
this.name = name;
this.age = age;
} Foo.prototype = {
GetInfo:function(){
return this.name + this.age;
},
Func:function(arg){
return this.name + arg;
}
}
var obj = new Foo('alex',22);
console.log(obj.name);
console.log(obj.GetInfo());
console.log(obj.Func(55));
</script>
执行结果:
alex
alex22
alex55
JS 之作用域链和闭包的更多相关文章
- js之作用域链到闭包
一.作用域 全局作用域和函数作用域(局部作用域). 一个变量的作用域就是源代码中定义这个变量的区域. 二.作用域链和闭包 全局变量只有一个(window,globel),全局环境下每一个函数都会形成一 ...
- 深入理解JS函数作用域链与闭包问题
function fun(n,o) { console.log(o) return { fun:function(m){ return fun(m,n); } }; } ); a.fun(); a.f ...
- js深入(三)作用域链与闭包
在之前我们根绝对象的原型说过了js的原型链,那么同样的js 万物皆对象,函数也同样存在这么一个链式的关系,就是函数的作用域链 作用域链 首先先来回顾一下之前讲到的原型链的寻找机制,就是实例会先从本身开 ...
- JS详细图解作用域链与闭包
JS详细图解作用域链与闭包 攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你 ...
- 1--面试总结-js深入理解,对象,原型链,构造函数,执行上下文堆栈,执行上下文,变量对象,活动对象,作用域链,闭包,This
参考一手资料:http://dmitrysoshnikov.com/ecmascript/javascript-the-core/中文翻译版本:https://zhuanlan.zhihu.com/p ...
- 前端高质量知识(四)-JS详细图解作用域链与闭包
攻克闭包难题 初学JavaScript的时候,我在学习闭包上,走了很多弯路.而这次重新回过头来对基础知识进行梳理,要讲清楚闭包,也是一个非常大的挑战. 闭包有多重要?如果你是初入前端的朋友,我没有办法 ...
- 在chrome开发者工具中观察函数调用栈、作用域链与闭包
在chrome开发者工具中观察函数调用栈.作用域链与闭包 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量 ...
- js中作用域链的问题
为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止 ...
- 前端基础进阶(六):在chrome开发者工具中观察函数调用栈、作用域链与闭包
在前端开发中,有一个非常重要的技能,叫做断点调试. 在chrome的开发者工具中,通过断点调试,我们能够非常方便的一步一步的观察JavaScript的执行过程,直观感知函数调用栈,作用域链,变量对象, ...
随机推荐
- xmind的第八天笔记
- kernel/Makefile
## Makefile for the linux kernel.## Note! Dependencies are done automagically by 'make dep', which a ...
- Oracle学习系列6
Oracle学习系列6 ************************************************************************************ 删除约 ...
- JSBinding / About 2048 sample
2048 Source 2048 source code is here: https://github.com/gabrielecirulli/2048 Play here!http://gabri ...
- Docker registry V2
部署私有Docker Registry 搭建 Insecure Registry 修改Registry server上的Docker daemon的配置,为DOCKER_OPTS增加–insecure ...
- Android AChartEngine 去除折线图黑边
通常使用AChartEngine画出的折线图,如果背景不是黑色,则会在折线图的坐标轴旁边出现黑边,如图所示: 试了好多设置,最后终于发现,去除黑边的设置是: mRenderer.setMarginsC ...
- 【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载(函数指针结构体)
为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪. 花了好久,追踪到了这个执行过程. 进入main ...
- express - ejs使用介绍
http://blog.sina.com.cn/s/blog_ad0672d60101l2ml.html 1.express中使用ejs var express = require('express' ...
- DDL DML DCL语句
总体解释:DML(data manipulation language):自动提交的数据库操作语言 它们是SELECT.UPDATE.INSERT.DELETE,就象它的名字一样 DDL( ...
- delphi 常用的将窗口置前的函数
function BringWindowToTopEx(hWnd: HWND): Boolean;begin if IsIconic(hWnd) then ShowWindow(hWnd, SW_RE ...