小白javascript(一):作用域

作用域(scope):域可以简单的理解为范围、空间、区域,作用可以简单的理解为可用、可读和可写。顾名思义"作用域"可以简单理解为在一个范围内使得代码可读可写。

块级作用域:任何一对花括号中{}的语句集属于一个块,在这之中定义的所有变量在代码块外都是不可见的。

如下java代码:

public class Test {

public static void main(String[] args) {

    if(true){
          int j =4;
    }
    System.out.println(j);
}
}

java报错因为j在if的块中定义,所以外层sysout 的时候j不是一个变量。

看下面一段js代码:

<script type="text/javascript">

    if(true){
           var i = 3;
    }
    alert(i);

</script>

alert的值是3,浏览器并没有报错,由此可见javascript中没有块级作用域的概念。也就是说在if else、for循环、while的里面定义 var a和在它们外面定义 var a 实际上是没有差别的。

函数作用域:

看下面一段js代码:

<script type="text/javascript">

function fn1(){

 var a = 0;

}
 alert(a);

</script>

浏览器报错,a is not defined。

由此可见在javascript中有函数作用域,也就是说,只有函数才会创建一个新的作用域。

javascript在执行包括两部分:1、初始化词法环境 2、逐行解读代码

词法环境:本质上是一种数据结构,可以用来管理静态作用域。也就是说可以用来管理javascript的作用域。(javascript的作用域是静态作用域,有兴趣的同学可以研究一下静态作用域和动态作用域)。

词法环境由以下两部分组成:

1.环境记录:包括 变量、形参、函数

2.对外层词法环境的引用(outer),当然最外层的词法环境它的outer是null

初始化词法环境:

在javascript中没有块级作用域,所以只有全局代码或者是函数代码开始执行之前会先把形参、函数定义、变量(使用var定义)写到词法环境。

var定义的变量在初始化到词法环境里面的时候都是undefined。只有执行到赋值语句的时候才能够给变量赋值。

函数定义在初始化词法环境的时候,会创建函数代码块。

形参、函数定义、变量在词法环境定义中名称冲突怎么办?

只留一个,并且函数定义优先级   大于 形参  大于 变量。

javascript在实行代码时候,表达式可以修改环境记录的值。

如下js代码:

<script type="text/javascript">

  alert(a);

  a = 1;

</script>

浏览器报错,a is not defined。初始化词法环境里a不是形参、函数定义、变量所以浏览器报错

<script type="text/javascript">

  alert(a);

  var a = 1 //表达式: = + - % ++ -- !参数 

</script>

浏览器没有报错,弹出undefined。初始化词法环境里a是变量。

练习:

<script type="text/javascript">

    alert(a);//①

    var a = 1;

    alert(a);//②

    function a(){ alert(2);}

    alert(a);//③

    var a = 3;

    alert(a);//④

    function a(){ alert(4);}

    alert(a);//⑤

    a();   //⑥

</script>

形参①function a(){ alert(4);} ②1、③1、④3、⑤3、⑥浏览器报错a不是一个函数。

<script type="text/javascript">

   var a = 1;

   function fn1(){

     alert(a);//①

     var a = 2;

   }

   fn1();

   alert(a);//②

</script>

①undefined ②1

<script type="text/javascript">

   var a = 1;

   function fn1(){

     alert(a);//①

     a = 2;

   }

   fn1();

   alert(a);//②

</script>

①1 ②2

<script type="text/javascript">

   var a = 1;

   function fn1(a){

     alert(a);//①

     a = 2;

   }

   fn1();

   alert(a);//②

</script>

①undefined ②1

时间: 2024-11-09 17:33:35

小白javascript(一):作用域的相关文章

深入浅出JavaScript变量作用域

在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域.赌王娱乐城 函数中声明的变量在整个函数中都有定义. 1.JavaScript的作用域链 首先看下下面这段代码: <script type="text/javascript"> var rain = 1;     function rainman(){     var man = 2;     function inn

javascript 的作用域

翻译自:http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html 如果以下代码执行,你知道出什么结果吗? var foo = 1; function bar(){ if(!foo){ var foo = 10; } alert(foo); } bar(); 这运行结果是10. 如果你对结果感到惊讶,请看下面例子: var a =1; function b(){ a = 10; return; function a(){}

JavaScript从作用域到闭包

作用域(scope) 全局作用域和局部作用域 通常来讲这块是全局变量与局部变量的区分. 参考引文:JavaScript 开发进阶:理解 JavaScript 作用域和作用域链 全局作用域:最外层函数和在最外层函数外面定义的变量拥有全局作用域. 1)最外层函数和在最外层函数外面定义的变量拥有全局作用域 2)所有末定义直接赋值的变量自动声明为拥有全局作用域,即没有用var声明的变量都是全局变量,而且是顶层对象的属性. 3)所有window对象的属性拥有全局作用域 局部作用域:和全局作用域相反,局部作

JavaScript 函数作用域的“提升”现象

在JavaScript当中,定义变量通过var操作符+变量名.但是不加 var 操作符,直接赋值也是可以的.例如 : message = "hello JavaScript ! " 即定义了一个全局变量message,并赋值 "Hello JavaScript!"--<JavaScript高级程序第三版> 如同往日一般,一群人在所谓的技术交流群里面相互斗图着.突然老王莫名的正经起来,在群里发了一道JavaScript的题目,让大家猜一猜这道题的答案. v

浅谈JavaScript的作用域

前段时间学了下JavaScript作用域,这个东西在JavaScript非常重要,也是JavaScript很基础的东西,正如少林里面基础武功,有了基础,才能学绝世武功. 作用域的作用是啥?一套设计良好的规则来存储变量,并且之后可以方便的找到这些变量. 就JavaScript里面的作用域来说,我总结有这么几个关键词: 1. 词法作用域 2. 函数作用域 3. 块级作用域 4. 闭包 5. 提升 好吧,我脑海里面能想到的就这么多了,不够的,也可以有朋友指出来,接下来,我一个一个过下这些词. 一.词法

JavaScript变量作用域

全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返回的将是局部变量的值. 例如: var scope="我是全局变量"; function checkscope(){ var scope="我是局部变量"; console.log(scope); } checkscope(); 输出:我是局部变量 这里需要注意的是,在

JavaScript的作用域

JavaScript的作用域主要是指函数的作用域,在进行结果判断的时候十分重要,如果不清楚作用域,便很有可能导致拿不到预期的结果,也就无法顺利的进行程序的编写,在经历了一系列的学习和了解之后,对相关知识进行一个汇总,认识比较浅显,希望可以帮助到有需要的人. 首先引入一个概念:词法分析 JavaScript在创建的时候会对function进行词法分析,函数会在创建时形成一个活动对象,ActiveObject,简称AO,先举一个实际的例子进行分析: function t1(age) { consol

JavaScript中作用域链和闭包

一.匿名函数 1.1 匿名函数的概念 ? 声明一个没有函数名的函数,就是匿名函数. ? 有函数名的函数就是具名函数. 看下面的代码: <script type="text/javascript"> /* //这里定义了一个函数,而且没有函数名.这样写语法是错误的,如果允许这样定义,那么根本就没有办法调用. //所以,我们可以用一个变量来存储一下 function(){ } */ // 声明了一个匿名函数,并把匿名函数赋值给变量f. 注意这个时候这个匿名函数并没有执行. va

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈