文档章节

变量的类型和作用域

hming
 hming
发布于 2016/11/30 16:04
字数 1379
阅读 5
收藏 0
点赞 0
评论 0

一、变量的类型
JS是一种无类型、弱检测的语言。它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量。例如:
i=100;//Number类型
i="variable";//String类型
i={x:4};//Object类型
i=[1,2,3];//Array类型
二、变量的声明
JS中变量申明分显式申明(局部变量)和隐式申明(全局变量)。
var i=100;//显式申明
i=100;//隐式申明

在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
注意:当我们使用或访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量。
三、全局变量和局部变量
当JS解析器执行时,首先就会在执行环境里构建一个全局对象,我们定义的全局属性就是做为该对象的属性读取,在顶层代码中我们使用this关键字和window对象都可以访问到它。
而函数体中的局部变量只在函数执行时生成的调用对象中存在,函数执行完毕时局部变量即刻销毁。
因此在程序设计中我们需要考虑如何合理声明变量,这样既减小了不必要的内存开销,同时能很大程度地避免变量重复定义而覆盖先前定义的变量所造成的Debug麻烦。
四、变量作用域
JS中变量的作用域,一个很大的特征就是JS变量没有块级作用域,函数中的变量在整个函数都中有效,运行下面代码1:
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();
输出结果为0 1 0,从上面就可以证明JS如果用var在函数体中声明变量,那么此变量在且只在该函数体内有效,函数运行结束时,局部变量即刻销毁了。
运行下面代码2:
function outPut(s){
    document.writeln(s)
}
var i=0;//全局变量
//定义外部函数
function outer(){
    outPut(i); //访问全局变量 0
    //定义一个内部函数
    function inner(){
        outPut(i); //undefined
        var i = 1;//显示申明 定义局部变量
        outPut(i); //访问局部变量 1
    }
    inner();
    outPut(i); //访问全局变量 0
}
outer();
输出结果是0 undefined 1 0,因为JS函数体中声明的局部变量在整个函数中都有效,因此在上面代码中var i = 1 ;在inner函数中都有效,实际上显式声明的变量i是在预编译时就已经编译到调用对象中了,不同于隐式声明变量在解释时才被定义为全局变量,只是在调用outPut(i)时,还没有将它初始化变量,此时的局部变量i是未赋值变量,而不是未定义变量,因此输出了undefined。上面的代码等效于下面代码:
function inner(){
    var i; //定义但不赋值
    outPut(i); //undefined
    i=1;
    outPut(i); //1
}
为了避免上面的这类问题,因此在函数开始位置集中做函数声明是一个极力推荐的做法。
五、基本类型和引用类型
JS在变量申明时并不需要声明变量的存储空间。变量中所存储的数据可以分为两类:基本类型和引用类型。其中数值、布尔值、null和undefined属于基本类型,对象、数组和函数属于引用类型。
基本类型在内存中具有固定的内存大小。例如:数值型在内存中占有八个字节,布尔值只占有一个字节。对于引用型数据,他们可以具有任意长度,因此他们的内存大小是不定的,因此变量中存储的实际上是对此数据的引用,通常是内存地址或者指针,通过它们我们可以找到这个数据。
引用类型和基本类型在使用行为上也有不同之处:
//定义一个输出函数
function outPut(s){
    document.writeln(s)
}
var a = 3;
var b = a;
outPut(b);//3
a = 4;
outPut(a);//4
outPut(b);//3
对基本类型b进行赋值时,实际上是又开辟了一块内存空间,因此改变变量a的值对变量b没有任何影响。
//定义一个输出函数
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
上面是对引用类型的变量赋值,实际上他们传递的是对内存地址的引用,因此对a_array和b_array的存取,实际上都是操作的同一块内存区域。如果希望重新分配内存空间存储引用型变量,那么我就需要使用克隆方法或者自定义方法来复制引用变量的数据。

© 著作权归作者所有

共有 人打赏支持
hming
粉丝 3
博文 88
码字总数 86648
作品 0
深圳
程序员
局部变量与全局变量

变量作用域:变量的可用范围 按照作用域的不同,变量可以分为:局部变量和全局变量 特点:不同作用内出现同名变量,内部作用域的变量会覆盖外部作用的变量 局部变量:定义在函数内部的变量以及...

5vinsEnt ⋅ 2016/03/15 ⋅ 0

JavaScript 学习笔记3

第四章 变量,作用域和内存问题 1.变量 可保存两种类型的值:基本类型值和引用类型值。 基本类型值源于五种基本数据类型。 基本类型值和引用类型值的对比: 1).基本类型值在内存中占据固定大...

candy-chocolate ⋅ 2016/11/01 ⋅ 0

jsp九大内置对象

request 请求对象  类型 javax.servlet.ServletRequest 作用域 Request response 响应对象 类型 javax.servlet.SrvletResponse 作用域 Page pageContext 页面上下文对象 类型 javax.servle......

笑容掩饰爱 ⋅ 2017/09/22 ⋅ 0

基本类型和引用类型,执行环境和作用域

一、理解基本类型和引用类型的值 ECMAScript变量包含两种不同数据类型的值:基本类型值 和 引用类型值。 基本类型值指的是简单的数据段,而引用类型的值指那些可能由多个值构成的对象 引用类...

蒙懵懵 ⋅ 2016/04/13 ⋅ 0

JSP九大内置对象及四个作用域

九大对象: 内置对象(又叫隐含对象,有9个内置对象):不需要预先声明就可以在脚本代码和表达式中随意使用 1-out: javax.servlet.jsp.JspWriter类型,代表输出流的对象。作用域为page(页面执...

飓风2000 ⋅ 2014/06/08 ⋅ 0

JavaScript权威指南笔记

第二章 词法结构 JavaScript区分大小写;/html不区分大小写 JavaScript会忽略程序中标识(token)之间的空格; 直接量:程序中直接使用的数据值; 标识符:字母、下划线(_)、美元($) 保...

drei ⋅ 2016/12/10 ⋅ 0

JS 底蕴之 变量、作用域和垃圾回收

基本类型和引用类型 在 JavaScript 中,数据类型可分为基本类型和引用类型, 基本类型有六种:Null,Undefined,String,Boolean,Number,Symbol; 而引用类型就是传说中的 Object 了。 其中...

Fly_001 ⋅ 05/23 ⋅ 0

js var, let, const特性

var, let, const 用来声明变量 一、let 用法 声明变量和var类似,但是所声明的变量,只在let命令所在的代码块内有效。而var声明的变量在全局或者当前函数作用域有效。 存在变量提升 var发生”...

EdmundChen ⋅ 05/09 ⋅ 0

js 基础(1) —— 提升

变量提升 提升:1. 变量提升 2. 函数提升 在解释提升之前,有必要先了解一下作用域 和作用域链 注意:以下解释非官方,个人理解 作用域:程序源代码中定义这个变量的区域 作用域链:当代码在...

jdkwky ⋅ 2017/11/17 ⋅ 0

javascript之变量,作用域和内存问题

基本类型和引用类型 javascript变量可能包含两种不同数据类型的值:基本类型值和引用类型值。基本类型值指的是那些保存在栈内存中的简单数据段,即这种值完全保存在内存中的一个位置。而引用...

柳哥 ⋅ 2015/04/06 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部