JavaScript变量作用域、函数作用域和声明提前

约定不等于承诺〃 2022-04-17 02:27 383阅读 0赞

1.变量作用域

在函数体内,局部变量的优先级高于同名的全局变量。如果在函数体内声明的一个局部变量或者函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。

尽管在全局作用域编写代码可以不写var语句,但声明局部变量时则必须使用var语句。(不使用var定义的局部变量会认为是全局变量)

  1. var scope = "global"
  2. var scope1 = "global1"
  3. function checkscope(){
  4. var scope = 'local'; //声明一个全局变量,甚至不用var来声明
  5. scope1 = 'local1'; //糟糕!我们刚修改了一个新的全局变量
  6. myscope = "local"; //这里显式地声明了一个新的全局变量
  7. return scope;
  8. }
  9. scope
  10. "global"
  11. scope1
  12. "local1"

2.函数作用域

JavaScript没有块级作用域(block scope),JavaScript有函数作用域(function scope),函数作用域就是在声明它们地函数体以及这个函数体嵌套的任意函数体内都是有定义的。

  1. function test(o){
  2. var i = 0; //i在整个函数体内均是有定义的
  3. if(typeof o == 'object' ){
  4. var j = 0; //j在函数体内是有定义的,不仅仅是在这个代码段内
  5. for(var k=0;k<10;k++){ //k在函数体内是有定义的,不仅仅是在循环内
  6. console.log(k);
  7. }
  8. console.log(k); //k已经定义了,输出10
  9. }
  10. console.log(j); //j已经定义了,但可能没有初始化
  11. }

我们在不同的位置定义了变量i、j和k,它们都在同一个作用域内——这三个变量在函数体内均是有定义的。

再看一个例子:

  1. <script type="text/javascript">
  2. var m = 5;
  3. if(m == 5){
  4. var n = 10;
  5. }
  6. alert(n); //代码1
  7. </script>

n一样可以正常输出10,因为没有块级作用域,大括号里面的变量也是全局变量,当然就可以正常访问了。 记住一点:函数内部的变量才是局部变量(包括形参)。

3.声明提前

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。有意思的是,这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hosting),即JavaScript函数里声明地所有变量(但不涉及赋值)都被“提前”至函数体的顶部。

  1. var scope = "global";
  2. function f(){
  3. console.log(scope); //输出"undefined",而不是"global"
  4. var scope = "local"; //变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
  5. console.log(scope); //输出"local"
  6. }

总结:声明提前,赋值不提前。

发表评论

表情:
评论列表 (有 0 条评论,383人围观)

还没有评论,来说两句吧...

相关阅读

    相关 javascript函数变量作用

    一 介绍 1、变量的作用域指明变量在程序中的作用范围。 2、在函数外定义的变量可以称为全局变量,它在页面声明此变量后的任何程序段位置都可以使用,使用全局变量,可以实现不同程