博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
小白javascript(一):作用域
阅读量:5064 次
发布时间:2019-06-12

本文共 1214 字,大约阅读时间需要 4 分钟。

作用域(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代码:

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

函数作用域:

看下面一段js代码:

浏览器报错,a is not defined。

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

 

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

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

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

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

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

  初始化词法环境:

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

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

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

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

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

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

如下js代码: 

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

 

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

 练习: 

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

 

①undefined ②1

 

①1 ②2

①undefined ②1

转载于:https://www.cnblogs.com/watson945/p/6024829.html

你可能感兴趣的文章
undefined reference to `_sbrk', `_write', `_lseek', `_read'
查看>>
基于zuul 实现API 网关
查看>>
定义自己的布局RelativeLayout 绘制网格线
查看>>
redis
查看>>
Ubuntu13.04 安装 chrome
查看>>
WampServer phpadmin apache You don't have permission to access
查看>>
解决sonarQube 'Unknown': sonar.projectKey
查看>>
ASPX页面弹窗的方法---javascript
查看>>
JavaScript和快速响应的用户界面
查看>>
winform控件跨线程委托
查看>>
利用subst命令将一个文件夹镜像成本地的一个磁盘
查看>>
NO 1,人生苦短,我学python之python+selenium自动化环境搭建
查看>>
206-反转链表
查看>>
Mybaits 插入数据返回主键ID
查看>>
PHP流程控制(一)
查看>>
判断是32位还是64位的CPU,CPU型号
查看>>
day 32 管道 事件 信号量 进程池
查看>>
做过的项目
查看>>
ubuntu14.04 +nginx+php5-fpm
查看>>
(转)最大类间方差法(Otsu)
查看>>