首页 > 代码库 > [Js]JavaScript闭包和范围的快速测试

[Js]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 = http://www.mamicode.com/1;alert(typeof value);    //"number"

②所有全局变量都是window属性,语句var a=1;等同于window.a=1;

所以代码执行顺序等价于

function a() {return  true; }  if(!("a" in window)) {      function a() { var a = 1; } }  alert(a); 

 输出结果:function a() {return true; }

3.

if (!("a" in window)) {      var a = function () { window.a = 1; }  }  alert(a);

 【分析】

①函数声明和函数表达式区别

函数声明:

function functionName(arg1, arg2){    //函数体}

函数表达式(相当于变量赋值):

var functionName = function(arg1, arg2){    //函数体};

所以代码执行顺序等价于