本文实例分析了JavaScript闭包和范围。分享给大家供大家参考,具体如下:
1.
if (!("a" in window)) { var a = 1;}alert(a);
【分析】代码含义:如果window不包含属性a,就声明一个变量a并赋值为1
①JS引擎会先扫描所有的变量声明
②所有的全局变量都是window的属性
③变量声明和赋值一起用时,Js引擎会自动将它分成两部分:变量声明提前,变量赋值没有(不将赋值提前是因为他有可能影响代码执行出不可预期的结果)
所以代码执行顺序等价于
var a;if(!("a" in window)) { a = 1;}alert(a);
解析:声明变量a,判断a是否存在,不存在就赋值为1,而这里a永远在window里存在,赋值语句永不执行,所以结果是undefined
2.
if (!("a" in window)) { function a() { window.a = 1; }}alert(a);
【分析】
①函数声明也会提前并且会覆盖变量声明,但不会覆盖变量赋值,如下例子
function value(){ return 1;}var value;alert(typeof value); //"function"
function value(){ return 1;}var value = 1;alert(typeof value); //"number"
②所有全局变量都是window属性,语句var a=1;等同于window.a=1;
所以代码执行顺序等价于
function a() {window.a = 1;}if(!("a" in window)) { function a() { var a = 1; }}alert(a);
输出结果:function a() {window.a = 1; }
变形:
if ("a" in window) { function a() { window.a = 1; }}alert(a);
输出结果:a is not defined
函数声明里的变量定义,要到执行函数时才会定义,并不会在预编译阶段就声明变量
3.
if (!("a" in window)) { var a = function () { window.a = 1; }}alert(a);
【分析】
①函数声明和函数表达式区别
函数声明:
function functionName(arg1, arg2){ //函数体}
函数表达式(相当于变量赋值):
var functionName = function(arg1, arg2){ //函数体};
所以代码执行顺序等价于
var a;if (!("a" in window)) { a = function () { window.a = 1; }}alert(a);
结果和第一题一样,undefined
4.
var a = 1, b = function a(x) { x && a(--x); };alert(a);
【分析】
①进入执行上下文的阶段
VO(global) = { a: undefined, b: undefined}
这阶段的顺序:函数的形参->函数声明->变量声明
②执行代码阶段
VO(global) = { x: undefined, a: 1}
③定义变量b,赋值名字为a的函数(这个a只能在函数体内使用)
新闻热点
疑难解答
图片精选