当前位置: 首页 > 编程日记 > 正文

js变量以及其作用域详解

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一、变量的类型 
  Javascript和Java、C这些语言不同,它是一种无类型、弱检测的语言。它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量。例如:

i=100;//Number类型 
i="variable";//String类型 
i={x:4};//Object类型 
i=[1,2,3];//Array类型

JS的这种特性虽然让我们的编码更加灵活,但也带来了一个弊端,不利于Debug,编译器的弱检测让我们维护冗长的代码时相当痛苦。

二、变量的声明 

JS中变量申明分显式申明和隐式申明。

var i=100;//显式申明
i=100;//隐式申明


在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。

当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。

三、全局变量和局部变量 
  当JS解析器执行时,首先就会在执行环境里构建一个全局对象,我们定义的全局属性就是做为该对象的属性读取,在顶层代码中我们使用this关键字和window对象都可以访问到它。而函数体中的局部变量只在函数执行时生成的调用对象中存在,函数执行完毕时局部变量即刻销毁。因此在程序设计中我们需要考虑如何合理声明变量,这样既减小了不必要的内存开销,同时能很大程度地避免变量重复定义而覆盖先前定义的变量所造成的Debug麻烦。 
  四、变量作用域 
  任何程序语言中变量的作用域都是一个很关键的细节。JS中变量的作用域相对与JAVA、C这类语言显得更自由,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,运行下面代码:

<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定义一个输出函数 
function outPut(s){ 
document.writeln(s) 

//全局变量 
var i=0; 
//定义外部函数 
function outer(){ 
//访问全局变量 
outPut(i); // 0 
//定义一个类部函数 
function inner(){ 
//定义局部变量 
var i = 1; 
// i=1; 如果用隐式申明 那么就覆盖了全局变量i 
outPut(i); //1 

inner(); 
outPut(i); //0 

outer(); 
</SCRIPT> 
  输出结果为0 1 0,从上面就可以证明JS如果用var在函数体中声明变量,那么此变量在且只在该函数体内有效,函数运行结束时,本地变量即可销毁了。 
  由于上面的这个JS特性,还有一个关键的问题需要注意。此前一直使用ActionScript,虽然它和JS都是基于ECMA标准的,但在这里还是略有不同的。例如下面代码:


<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定义一个输出函数 
function outPut(s){ 
document.writeln(s) 

//全局变量 
var i=0; 
//定义外部函数 
function outer(){ 
//访问全局变量 
outPut(i); // 0 
//定义一个类部函数 
function inner(){ 
outPut(i); //undefiend 
var i=1; 
outPut(i); //1 

inner(); 
outPut(i); //0 

outer(); 
</SCRIPT> 
  你可能认为输出结果是0 0 1 0,事实上在AS中确实是这样的,而在JS中的输入却是0 undefined 1 0,为何会这样了?刚才我们说到了JS函数体中声明的本地变量在整个函数中都有效,因此在上面代码中var i = 1 ;在inner函数中都有效,实际上显式声明的变量i是在预编译时就已经编译到调用对象中了,不同于隐式声明变量在解释时才被定义为全局变量,只是在调用outPut(i)时,还没有将它初始化变量,此时的本地变量i是未赋值变量,而不是未定义变量,因此输出了undefined。上面的代码等效于下面代码:


function inner(){ 
var i; //定义但不赋值 
outPut(i); //undefiend 
i=1; 
outPut(i); //1 

  为了避免上面的这类问题,因此在函数开始位置集中做函数声明是一个极力推荐的做法。 

五、基本类型和引用类型

JS不同于JAVA、C这些语言,在变量申明时并不需要声明变量的存储空间。变量中所存储的数据可以分为两类:基本类型和引用类型。其中数值、布尔值、null和undefined属于基本类型,对象、数组和函数属于引用类型。 
  基本类型在内存中具有固定的内存大小。例如:数值型在内存中占有八个字节,布尔值只占有一个字节。对于引用型数据,他们可以具有任意长度,因此他们的内存大小是不定的,因此变量中存储的实际上是对此数据的引用,通常是内存地址或者指针,通过它们我们可以找到这个数据。 
  引用类型和基本类型在使用行为上也有不同之处:


<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定义一个输出函数 
function outPut(s){ 
document.writeln(s) 

var a = 3; 
var b = a; 
outPut(b); 
//3 
a = 4; 
outPut(a); 
//4 
outPut(b); 
//3 
</SCRIPT> 
  对基本类型b进行赋值时,实际上是又开辟了一块内存空间,因此改变变量a的值对变量b没有任何影响。


<SCRIPT LANGUAGE="JavaScript" type="text/javascript"> 
//定义一个输出函数 
function outPut(s){ 
document.writeln(s) 

var a_array = [1,2,3]; 
var b_array = a_array; 
outPut(b_array); //1,2,3 
a_array[3] = 4; 
outPut(b_array);//1,2,3,4 
</SCRIPT>

上面是对引用类型的变量赋值,实际上他们传递的是对内存地址的引用,因此对a_array和b_array的存取,实际上都是操作的同一块内存区域。如果希望重新分配内存空间存储引用型变量,那么我就需要使用克隆方法或者自定义方法来复制引用变量的数据。

转载于:https://my.oschina.net/winnsay/blog/633547

相关文章:

在A*寻路中使用二叉堆

在A*寻路中使用二叉堆 作者&#xff1a;Patrick Lester&#xff08;2003年4月11日更新&#xff09; 译者&#xff1a;Panic 2005年3月28日 译者序&#xff1a; 这一篇文章&#xff0c;是“A* Pathfinding for Beginners.”&#xff0c;也就是我翻译的另一篇文章A*寻路初探…

“Hey Siri” 背后的黑科技大揭秘!

作者 | Vishant Batta译者 | 苏本如&#xff0c;责编 | 伍杏玲出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下是译文&#xff1a; 如今苹果手机可随时检测并回答“Hey Siri”命令&#xff0c;有人可能会想&#xff0c;它是不是在随时记录我们的日常生活对话呢…

[ASP.NET4之旅]Circular file references are not allowed

将ASP.NET 2.0的项目升级到ASP.NET 4后&#xff0c;用VS2010编译站点&#xff0c;某些控件出现编译错误“Circular file references are not allowed”&#xff0c;比如&#xff1a; <% Control Language"C#"ClassName"NewsRight"%>解决方法&#xf…

IOS-XMPP

一、即时通讯技术简介 即时通讯技术&#xff08;IM -- Instant Messaging&#xff09;支持用户在线实时交谈。如果要发送一条信息&#xff0c;用户需要打开一个小窗口&#xff0c;以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容有许多的IM系统&#xff0c;如AO…

libcurl使用

官网&#xff1a;http://curl.haxx.se/libcurl/c/libcurl-tutorial.html #curl-config --libs 得到 -lcurl #cc libcurl_test.c -o libcurl_test -lcurl 所有的例子&#xff1a;http://curl.haxx.se/libcurl/c/example.html 例子&#xff1a; /***********************…

RH5.4下samba共享配置实例(3)

一、基于用户名的访问控制实例&#xff1a; 王乾大哥写的比较详细了&#xff0c;我是跟着他的教程学习的&#xff0c;按照他的教程走一边&#xff1b; 要求如下&#xff1a; 1、创建一个公共的交换文件夹&#xff0c;所有人都可以写入删除&#xff0c;但不能删除修改其他人的文…

《评人工智能如何走向新阶段》后记(再续21)

346.中国抗疫十大黑科技&#xff08;以人工智能为主力的黑科技&#xff09; 摘自数邦客&#xff08;2020.3.30发布&#xff09; 负压救护车 人工智能机器人&#xff1a;如送餐机器人、消毒机器人、服务型机器人&#xff0c;及机器人呼叫等呼吸道病毒核配检测试剂盒&#xf…

ssh-keygen

nagios npc安装后状态为off的解决方法

1、检查ndo2db的进程是不是二个 nagios 16825 0.0 0.1 6784 396 ? Ss 19:05 0:00 /usr/local/nagios/bin/ndo2db -c /usr/l nagios 17032 0.0 0.3 6784 1268 ? S 19:09 0:00 /usr/local/nagios/bin/ndo2db -c 2、检查nagios.log日志看…

C语言extern关键字定义外部变量--Redis源码extern使用

在Redis2.8中有networking.c&#xff0c;这个文件没有networking.h networking.c首先引入redis.h这个头文件 #include "redis.h" 在redis.c一开始就声明了全局变量 /* Global vars */ struct redisServer server; networking.c的createClient函数 redisClient *cr…

深度学习面试必备的25个问题

作者 | Tomer Amit译者 | 弯月&#xff0c;编辑 | 屠敏出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;在本文中&#xff0c;我将分享有关深度学习的25个问题&#xff0c;希望能够帮助你为面试做好准备。1.为什么必须在神经网络中引入非线性&#xff1f;答&#xf…

一分钟了解阿里云产品:先知计划

一、 概述 阿里云发布了各种各样的产品&#xff0c;今天让我们一起来了解下阿里云先知计划吧。 什么是先知计划呢&#xff1f; 先知计划是一个帮助企业建立私有应急响应中心的平台&#xff08;帮助企业收集漏洞信息&#xff09;。企业加入先知计划后&#xff0c;可…

C语言的HashTable简单实现

原文地址&#xff1a;http://blog.csdn.net/zmxiangde_88/article/details/8025541 HashTable是在实际应用中很重要的一个结构&#xff0c;下面讨论一个简单的实现&#xff0c;虽然简单&#xff0c;但是该有的部分都还是有的。 一&#xff0c;访问接口 创建一个hashtable. h…

GitHub标星2000+,如何用30天啃完TensorFlow2.0?

作者 | 梁云1991来源 | Python与算法之美&#xff08;ID:Python_Ai_Road&#xff09;天下苦tensorflow久矣&#xff01;尽管tensorflow2.0宣称已经为改善用户体验做出了巨大的改进&#xff0c;really easy to use&#xff0c;但大家学得并不轻松。tensorflow2.0官方文档和tenso…

【Struts2学习笔记(1)】Struts2中Action名称的搜索顺序和多个Action共享一个视图--全局result配置...

一、Action名称的搜索顺序 1&#xff0e;获得请求路径的URI&#xff0c;比如url是&#xff1a;http://server/struts2/path1/path2/path3/test.action 2&#xff0e;首先寻找namespace为/path1/path2/path3的package&#xff0c;假设不存在这个package则运行步骤3&#xff1b;假…

大话卷积神经网络CNN,小白也能看懂的深度学习算法教程,全程干货建议收藏!...

来源 | 程序员管小亮本文创作的主要目的&#xff0c;是对时下最火最流行的深度学习算法的基础知识做一个简介&#xff0c;作者看过许多教程&#xff0c;感觉对小白不是特别友好&#xff0c;尤其是在踩过好多坑之后&#xff0c;于是便有了写这篇文章的想法。由于文章较长&#x…

频繁分配释放内存导致的性能问题的分析--brk和mmap的实现

&#xfeff;现象1 压力测试过程中&#xff0c;发现被测对象性能不够理想&#xff0c;具体表现为&#xff1a; 进程的系统态CPU消耗20&#xff0c;用户态CPU消耗10&#xff0c;系统idle大约70 2 用ps -o majflt,minflt -C program命令查看&#xff0c;发现majflt每秒增量为0&…

Linux 服务器日志文件查找技巧精粹

用来在日志文件里搜索特定活动事件的工具不下几十种&#xff0c;本文将介绍搜索日志文件时应该采取的策略。然后&#xff0c;通过几个具体示例介绍一些使用grep命令手动搜索日志文件的办法。接下来&#xff0c;我们将看到 logwatch工具和logsurfer工具的用法。最后&#xff0c;…

程序猿面试什么最重要?

程序猿面试一直是社区乐于讨论的热门话题。我自己从06年实习以来。先后经历了4家软件公司。所有是外企。当中有世界500强的通信企业&#xff0c;有从事期权期货交易的欧洲中等规模的金融公司&#xff0c;也有为大型汽车制造商开发Android智能汽车的新兴公司。跨入IT行业以来。我…

open的O_DIRECT选项

http://blog.chinaunix.net/uid-223060-id-2127385.html http://blog.csdn.net/hhtang/article/details/6605951 查看磁盘分区&#xff1a; #df -h #tune2fs -l /dev/mapper/VolGroup-lv_root 或者 #dumpe2fs /dev/mapper/VolGroup-lv_root|grep -i "block size"…

2020 年,AI 芯片内存哪家强?

目前多家公司都在开发网络边缘系统的AI芯片&#xff0c;本文作者详细分析AI边缘芯片遇到的问题和挑战&#xff0c;并给出一些新的内存技术解决方案。作者 | Mark LaPedus译者 | 弯月&#xff0c;责编 | 伍杏玲封图 | CSDN下载自视觉中国出品 | CSDN&#xff08;ID:CSDNnews&…

Excel数字、文本混合列导入SQL Server出现的问题&解决办法

版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明http://annie-out.blogbus.com/logs/60276495.htmlExcel文件&#xff1a;序号 姓名 内部电话 住址 1 小李 1234 …… 2 小王5678……3小张2345(国内长途&#xff09;…………………………如上结构的…

ARM 位置无关代码(PIC)的分析理解

2019独角兽企业重金招聘Python工程师标准>>> PIC的特点是&#xff1a; 它被加载到任意地址空间都可以正确的执行。其原理是PIC对常量和函数入口地址的操作都是基于PC偏移量的寻址方式。即使程序被移动&#xff0c;但是PC也变化了&#xff0c;而偏移量是不变的&#…

Linux压缩/解压缩

整合资源&#xff0c;仅供自己参考&#xff1a;&#xff09; TAR 命令名 tar - tar 档案文件管理程序的 GNU 版本。下面将逐个介绍其含义 总览 tar [ - ] A --catenate --concatenate | c --create | d --diff --compare | r --append | t --list | u --update | x -extract -…

为什么校招面试中总被问“线程与进程的区别”?我该如何回答?

作者 | 宇宙之一粟责编 | 徐威龙出品 | AI 科技大本营&#xff08;rgznai100&#xff09;进程与线程&#xff1f;&#xff08;Process vs. Thread&#xff1f;&#xff09;面试官&#xff08;正襟危坐中&#xff09;&#xff1a;给我说说“线程”与“进程”吧。我&#xff08;总…

Linux线程编程

1.编译 undefined reference to pthread_create问题解决 出现如下错误&#xff1a; undefined reference to pthread_create undefined reference to pthread_join 问题原因&#xff1a; pthread 库不是 Linux 系统默认的库&#xff0c;连接时需要使用静态库 libpthread…

PHP引擎php.ini 和fastcti优化

1.1 php引擎缓存优化加速1&#xff09;eaccelerator2&#xff09;Zend3&#xff09;xcache1.2 使用tmpfs作为缓存加速的的文件目录[rootLNMP ~]# mount -t tmpfs /dev/shm -o size256m[rootLNMP ~]# mount -t tmpfs /dev/shm/ /tmp/eaccelerator/提示&#xff1a;1、上传图片缩…

从*p++说指针,数组,结构和函数

说明文中*p和*s都是一个东西&#xff0c;不做字面上的统一了。 因为右结合性&#xff0c;*p 其实就是 *(p) 1.strlen的实现 #include <stdio.h> main(){char str[] "Abcde";printf("\n string %s length %d \n",str,str_length(str)); }int str…

8比特数值也能训练模型?商汤提训练加速新算法丨CVPR 2020

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;在CVPR 2020上&#xff0c;商汤研究院链接与编译团队、高性能计算团队和北航刘祥龙老师团队合作提出了用于加速卷积神经网络训练过程的INT8训练技术。该工作通过将网络的输入、权重和梯度量化到8比特来加速网络的前向传…

×××作,不知写些什么

博客&#xff0c;老是有写的冲动&#xff0c;不过&#xff0c;没什么韧劲坚持&#xff0c;自己感觉文采一般般啦&#xff0c;有时兴起&#xff0c;挥毫泼墨&#xff0c;蜡笔重唱一番&#xff0c;呵呵&#xff0c;自个爽朗了&#xff0c;呵呵 所以&#xff0c;自己坚持&#xff…