javascript 之作用域-06

作用域

作用域:是指变量可访问的范围,他规定了如何查找变量,也就是确定当前执行代码对变量的访问权限。

作用域有两种工作模式:

静态作用域 :又称为词法作用域,在编译阶段就可以决定变量的引用,由程序定义的位置决定,和代码执行顺序无关,用嵌套的方式解析。

动态作用域 :在程序运行时候,和代码的执行顺序决定,用动态栈动态管理。

JavaScript采用词法作用域,也就是说函数的执行依赖于变量的作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的;

静态作用域与动态作用域

JavaScript 采用的是词法作用域,函数的作用域在函数编译阶段就确定了。

 1 <script>
 2     var a = 10;
 3     function run() {
 4         console.log(a);//10
 5     }
 6     function fo() {
 7         var a = 20;
 8         run();
 9     }
10     fo();
11 </script>

执行 run函数,先从run 函数内部查找是否有局部变量 a,如果没有,就根据代码书写位置,向上查找变量a,也就是a等于10,所以结果会打印 10。

假设JavaScript采用动态作用域,让我们分析下执行过程:

执行run 函数,依然是从run 函数内部查找是否有局部变量 a。如果没有,就从调用函数的作用域,也就是fo函数内部查找 a变量,所以结果会打印 20。

前面我们已经说了,JavaScript采用的是静态作用域,所以这个例子的结果是 10。

全局作用域、函数作用域

ES5在词法作用域工作模式(一种规则)下又分为全局作用域和函数作用域,没有块作用域(es6以后有)。

全局作用域:该作用域的变量、对象在任何地方都是可见的,变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域,window对象的所有属性拥有全局作用域,在代码任何地方都可以访问。

在客户端javascript 中,表示的浏览器窗口中window对象充当了全局对象,拥有全局作用域。

 1 <script>
 2     var a = 10;
 3     function run() {
 4         console.log(a);//10
 5     }
 6     function fo() {
 7         var a = 20;
 8         run();
 9     }
10     fo();
11 </script>
12 <script>
13     console.log(a)//10
14 </script>

全局变量a ,在run函数以及第二个<script>代码块中也是可见的;

函数作用域:在函数内声明的变量,那么在函数内及其子函数内都是可见的,在函数外是不可见的。

1  function fo(){
2         var myName='Joel';
3     }
4     console.log(myName)//ReferenceError: myName is not defined

块级作用域是指在{...}内的代码块,每一段代码块都有各自的作用域,且声明的变量在代码块外是不可见的 如:

1  function run(){
2         var a=10;
3         if(true){
4             var b=10;
5         }
6         console.log(b);//如果存在块作用域,那么这里打印这个b是会报错的
7     }

 

总结

单纯的作用域还是好理解,javascript的作用域是静态作用域,即应该关心代码的位置而不是调用的位置 如:

 1 <script>
 2     var x=10;
 3     function fn(){
 4         console.log(x);
 5     }
 6     function show(f){
 7         var x=20;
 8         (function(){
 9           f()
10         }());
11     }
12     show(fn);//10
13 </script>

 

转载于:https://www.cnblogs.com/CandyManPing/p/7744514.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[导入]基于Web的B/S结构实时监控系统[转]

文章编号&#xff1a;1009-0193(2002)01-0062-02基于Web的B&#xff0f;S结构实时监控系统尉学军&#xff0c;刘 跃&#xff08;贵州工业大学 电气工程学院&#xff0c;贵州 贵阳 550003&#xff09;摘 要&#xff1a;提出了怎样利用Web技术对生产过程进行监控&#xff0c;介绍…

被裁之后才明白:有一种抗风险能力,叫做会讲故事

如果你注意观察&#xff0c;会发现周围总有这么一种人&#xff1a;他说的每句话&#xff0c;单拎出来都没毛病&#xff0c;但一说出口就让人无法接受&#xff0c;很难说服你。尤其在职场里&#xff0c;这种无效沟通特别多&#xff0c;以至于产生了庞大的“沟通成本”&#xff1…

saltstack php,Saltstack快速入门简单汇总

[rootmaster~]# salt \* test.pingminion-1:Trueminion-2:Trueminion-3:Trueminion-4:TrueTrue代表正常&#xff0c;没有响应当然代表客户端没有启动或者没有认证成功之类的。指定目标主要有五种方式一&#xff1a; Global&#xff0c;即salt默认的匹配方式&#xff0c;能识别终…

课下测试03!03!03!题目截图及解析(不完全正确)第四周--信息安全系统设计基础...

课下测试03&#xff0c;也就是第三章内容&#xff0c;以下分析和解析仅供参考哦~ 注意&#xff01;最好是对着题目看一下书&#xff0c;自己思考一下题目&#xff08;毕竟我页数都给你标出来了&#xff09;&#xff0c;不是说这样你就能提高了&#xff0c;而是我正确率真不高&a…

哦!数组还能这么用,学到了!

来源&#xff1a;公众号【编程珠玑】作者&#xff1a;守望先生ID&#xff1a;shouwangxiansheng这个问题源于读者在阅读redis源码时的一个疑问。先看下面的代码&#xff0c;对于包含动态字符串成员的两个结构体Test0和Test1占用空间分别是多少呢&#xff1f;//来源&#xff1a;…

推荐开源代码2004/12/17

严正声明&#xff1a;本博客中的任何随笔、文章、图片等内容都不能私自转载&#xff0c;必须书面征得作者同意才能转载&#xff0c;并不能随意篡改&#xff0c;如要作出任何改动&#xff0c;必须书面征得作者同意方可&#xff0c;作者拥有一切权利并保留一切追究权利&#xff0…

matlab图片取模程序,彩屏图像取模,BMP图像提取程序示例 | 学步园

//bmconv.c#include #include#include#include"bmconv.h"/*************************************************************************文件名称:bmconv.c/bmconv.h文件功能:BMP提取到点阵RGB显示创建时间:2013-04-20文件作者:女孩不哭文件版本:1.0文件说明:专用***…

pug模板引擎——jade

随着前端项目工程化的发展&#xff0c;代码结构越来越复杂&#xff0c;代码却越来越简单&#xff0c;为了将更多的精力集中在业务功能上面&#xff0c;对页面的快速构建需求日益剧增&#xff0c;同js、css一样&#xff0c;html也出现了各种各样的工具&#xff0c;即模板引擎&am…

广东,就是这么横?

昨晚的稿 今天发一下 应该有好久好久没有写篮球相关的文章了&#xff0c;因为之前写了被骂了&#xff0c;不过&#xff0c;今天不一样&#xff0c;毕竟方超巨打得这么好&#xff0c;不吹一下&#xff0c;总感觉今天不完整&#xff0c;骂就骂了吧&#xff0c;反正也不差这一次了…

在ASP.NET中利JavaScript实现控件的聚焦

在Windows应用程序中很容易控制控件的聚焦&#xff0c;但是在ASP.NET中并没有提供这样的功能&#xff0c;但是我们同样可以实现这样的功能&#xff0c;这篇文章就讲述了通过JaveScript实现在页面上某一特定控件获得焦点的功能。 下面是用到的JavaScript代码。 <script langu…

mysql自动备份发邮箱,定时任务自动备份数据库并邮件发送

我原本是使用Vastar的第一个脚本方案来自动备份WordPress数据库并邮件发送的&#xff0c;不过后来因为更换服务器&#xff0c;不知道为什么造成了会二次备份并有错误提示。刚好Vastar又给了一个更简洁的方法&#xff0c;于是昨天就替换掉了。不过Vastar的是同时备份数据库和网站…

电厂各类设备原理动图,绝对让你看花眼!

▲ 火力发电流程原理▲ 核能发电流程原理▲ 水力发电流程原理▲ 光热发电原理▲ 垃圾发电原理▲ 蒸汽吸收式制冷原理▲ 尿素热解脱硝流程原理▲ 湿法脱硫工艺原理▲ 钢球磨煤机内煤的破碎原理▲ 碎煤机工作原理▲ 螺旋输送机&#xff08;绞龙&#xff09;原理▲ 多管电除尘器▲…

也谈MMU管理机制

1&#xff0c;结构&#xff1a; MMU存储器系统的结构允许对存储器系统的精细控制。大部分的控制细节由存在存储器中的转换表提供。这些表的入口定义了从1KB 到1MB 的各种存储器区域的属性。这些属性包括&#xff1a; 虚拟地址到物理地址映射 ARM 处理器产生的地址叫虚拟…

__ATTRIBUTE__ 你知多少?

_ATTRIBUTE__ 你知多少&#xff1f; 1 #include "stdio.h"2 3 /* 地址参考基准 */4 5 char r1;6 short r2;int refer;7 8 struct p9 { 10 int a; 11 12 char b; 13 14 short c; 15 16 }__attribute__((aligned(4))) pp; 17 /* 4字节对齐&#xff0c;a…

oracle 根据分隔符提取,oracle自定义函数按照某个分隔符拆分字符串

1.首先需要定义一个集合类型&#xff0c;我这里定义的是变长数组类型(VARRAY)create type type_splitstr is varray(1024) of varchar2(128);--注意&#xff0c;我这里之所以不用嵌套表类型(NESTED TABLE)&#xff0c;是因为oracle官方文档有如下说明。--Nested Tables: The in…

跟几位大佬共进晚餐

这是一篇几个程序员大佬聚会的聚后感文章这次聚会比较唐突&#xff0c;连总从广州专门开车来深圳看望我们&#xff0c;我们约在了某个地铁站的八合里牛肉火锅店&#xff0c;这是一个周五的下午&#xff0c;理论上是非常简单的一个周五&#xff0c;但是因为这些男人女人的存在&a…

vue.js框架搭建

安装脚手架 前提条件&#xff1a;已安装node&#xff08;4.0版本以上&#xff09;&#xff0c;npm a、全局安装 vue-cli npm install -g vue-cli 安装成功后可以通过命令行查看版本号&#xff0c;如图 b、初始化项目 新建一个文件夹命名为01vue&#xff0c;准备在此文件夹下存放…

oracle数据库imp导入,imp 导入 没有数据库

IMP-00009: 导出文件异常结束今天准备从生产库向测试库进行数据导入&#xff0c;结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误&#xff0c;google一下&#xff0c;发现可能有如下原因导致imp的数据太大&#xff0c;没有写buffer和commit两个数据库字符集不同从…

MIK C语言面试两题

这是一个读者朋友在知识星球上提到的两个笔试题&#xff0c;第一个题目比较简单&#xff0c;关键在第二个题目「编程题」&#xff0c;我文章中写的解题思路应该不是最好的&#xff0c;希望大神读者们给出更好的答案&#xff0c;让这个充满乐趣的程序世界再增添一些乐趣吧&#…

[听尉迟方侃侃]平台

很长一段时期我都不能理解什么叫做平台。这个平台那个平台&#xff0c;随随便便的东西都要带上“平台”两个字以期蓬荜生辉。搞得人很是反感。 查了一下金山词霸&#xff0c;对平台一词有两个解释和软件行业相关&#xff1a; 解释1、[platform] ∶ 通常高于附近区域的平…