javascript 声明提前

来源:互联网 发布:windows性能监控 编辑:程序博客网 时间:2024/04/29 15:23

概念

        像java和C等高级语言存在函数级变量和块变量,其有着不同的作用域,分别是函数级作用域,块作用域。如有全局变量出现在函数域或者块域中,其值会被覆盖。在javascript中不存在块变量作用域,在像if, for 等{}中的变量,其作用域就是函数作用域。由此会带出申明提前的概念。

 

分析

我们可以通过三个例子来分析这种现象:

1.正常情况

var scope = “global”;

function checkscope()

{

var scope ='local';

return scope;

}

checkscope() ;         //=> local

 

 

2. 函数嵌套

var scope = “global”;

function checkscope()

{

var scope ='local';

 

             function nestedscope()

             {

                 var scope = 'nested';

                  return scope;

              }

return nestedscope();

}

checkscope() ;         //=> nested

 

3. 现象

function test(o)

{

   var i=0

if(typeof o=='object')

{

        var j = 0;

             for(var k=0;k<10;k++)

              {

                 console.log(k);

               }

          console.log(k);    //输出 10

}

console.log(j);   //输出 0

}

 

 

 

4. 申明提前

var scope = 'global'

function f()

{

   console.log(scope);  //输出 undefined 而不是 global

  var scope = 'local';    //变量初始化

  console.log(scope);  //输出 local

}

 

 

5. 对比

 

var scope = 'global'

function f()

{

   var scope;

   console.log(scope);  //输出 undefined 而不是 global

  scope = 'local';    //变量初始化

  console.log(scope);  //输出 local

}

 

由代码4,5可以看出,

1. javascript的申明提前只是针对于申明,将申明提前至函数顶部,但是初始化的位置还是留在原来的位置。

2. javascript的全局变量其实是全局对象的一个属性,是ECMAScript强制规定的,可以通过this.来引用,但是没有办法来获取局部变量中存在的对象。

3. javascript程序员可以将所有函数体变量放在函数顶部,这样可以很清楚的知道真是变量的作用域,这也是作为javascript程序员的良好习惯。

 

原创粉丝点击