javascript权威指南 学习笔记之变量作用域分享

不知道,大家对语言中变量的“声明”与“定义”是怎么理解的,
我的理解如下:
“声明”变量,只是仅仅声明,而“定义”变量,指声明了,并且赋值了。
例如:


代码如下:

var name;//只是声明
var num = 11;//声明,并且赋值,即定义了
var password = "yangjiang";//声明,并且赋值,即定义了

下面是几点总结:
变量的作用域:全局的和局部的。(注意:如果尝试读取一个未声明的变量的值,javascript会生成一个错误)
第一点:在都使用var关键字修饰变量的情况下,如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,
那么就有效地隐藏了这个全局变量。
例如:


代码如下:

var scope1 = "global";//var修饰
function checksScope(){
var scope1 = "local";//var修饰
document.write(scope1);
}checksScope();//local

第二点:如果尝试给一个未用 var 关键字声明的变量,那么,隐式声明的变量总是被创建为全局变量,即使
该变量只在一个函数体内使用(只有该函数运行了,才会发生作用),注意不支持函数嵌套的情形。
例如:


代码如下:

scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
function checkScopeA(){
scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
document.write("<br/>"+scope2);
myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
document.write(","+myscope);
}
checkScopeA();//localAAAAA,myLocalAAAAA *A
document.write("<br/>"+scope2);//localAAAAA *B
document.write("<br/>"+myscope);//myLocalAAAAA *C

如果将上面的例子中的 *A处的代码注释掉,
例如:


代码如下:

scope2 = "globalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
function checkScopeA(){
scope2 = "localAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
document.write("<br/>"+scope2);
myscope = "myLocalAAAAA";//没有使用var修饰(js会默认将其声明为全局变量)
document.write(","+myscope);
}
//checkScopeA(); *A
document.write("<br/>"+scope2);//globalAAAAA *B
document.write("<br/>"+myscope);//发生错误 *C

因为函数checkScopeA没有执行,所以 *B处输出为globalAAAAA;
因为函数checkScopeA没有执行,所以变量myscope没有声明,如果尝试读取一个未声明的变量,会发生错误。
第三点:
在javascript中,函数的定义是可以嵌套的。由于 每个函数都有它自己的局部作用域,所以有可能出现几个局部作用域的嵌套层。
例如:


代码如下:

var scope3 = "global scope"; //定义了一个全局变量
function checkScopeB(){
var scope3 = "local scope"; //定义了一个局部变量,覆盖了全局变量scope3
function nested(){
var scope3 = "nested scope"; //在函数的函数的内部,定义了一个局部变量
document.write("<br/>"+scope3); //nested scope
}
nested();
}
checkScopeB();//nested scope

第四点:
在javascript中,没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有声明的。
在javascript中,没有块级作用域,函数中定义的所有变量,无论是在哪里定义的,在整个函数中它们都是有定义的。
例如:


代码如下:

function test(o){//根据以上的说明:此函数中的i,j,k三个变量的作用域是相同的。
var i = 0; //变量 i 在整个函数中都有定义
if(typeof o == "object"){
var j = 0 ; //变量 j 在整个函数中都有定义,而不仅仅是在 if 语句块
for(var k=0;k<10;k++){//变量 k 在整个函数中都有定义,而不仅仅是在 if 语句块
document.write("<br/>k的值为:"+k);
}
document.write("<br/>for循环外k的值:"+k);//此时的 k 仍然被定义了,k=10
}
document.write("<br/>j的值:"+j); //变量 j 被声明了,但可能没有被初始化 因为可能往函数中 传入的参数 不是对象 ,if语句块不会执行
}

下面通过两种方式调用此函数:
方式一:传入对象
test({});//输出结果:上例中的注释
方式二:什么都不传
test();//输出结果:j的值:undefined
想不明白的是,在第二种方式中的输出结果,为什么会是 undefined。我当时猜的是:j的值:0
后来,这本书上面说:
由于局部变量在整个函数体内都是有声明(或定义)的,这就意味着在整个函数体中都隐藏了同名的全局
变量。虽然 局部变量在整个函数体内中都是有声明(或定义)的,但是在执行var语句之前,它是不会被初始化的。
这样的话,上面的方式二调用的输出结果,就比较好解释了,由于变量j在整个函数中都有定义,而又由于传入函数的参数为空,所以函数体中的if语句不会执行,从而使得j的值为undefined.(这是我参照上面书上说的那句话的理解)
下面的例子,更好的说明:


代码如下:

var sssss = "全局变量";
function f(){
document.write("<br/>"+sssss);//输出:undefined 而不是输出"全局变量"
var sssss = "局部变量";
document.write("<br/>"+sssss);//输出:局部变量
}

(0)

相关推荐

  • 详解JavaScript权威指南之对象

    JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删. JavaScript中的所有事物都是对象:字符串.数字.数组.日期,等等. JavaScript对象除了可以保持自有的属性外,还可以从一个称为原型的对象继承属性.对象的方法通常是继承的属性.这种"原型式集成"是JavaScript的的核心特征. 1.创建对象 第一种:对象直接量表示法创建对象. 这是最简单的对象创建方式,对象直接量由若干key:value键值对属性组成,属性之间用逗号分隔,整个对象用花

  • javascript权威指南 学习笔记之javascript数据类型

    复制代码 代码如下: <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>javascript数据类型</title> </head> <body> <script type="text/javasc

  • javascript权威指南 学习笔记之null和undefined

    复制代码 代码如下: <!doctype html> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>javascript之null和undefined</title> </head> <body> <script type="

  • JavaScript 权威指南(第四版) 读书笔记

    Javascript是无类型.解释型语言 对大小写敏感 html对大小写不敏感 忽略空格符.制表符.换行符(关键字.变量.正则表达式 除外) ";"分号可选择 //单行注释 /*多行注释*/ 标示符 开头必须是字母.下划线.$符号 关键字: break delete function return typeof case do if switch var catch else in this void continue false instanceof throw while debu

  • javascript权威指南 学习笔记之变量作用域分享

    不知道,大家对语言中变量的"声明"与"定义"是怎么理解的, 我的理解如下: "声明"变量,只是仅仅声明,而"定义"变量,指声明了,并且赋值了. 例如: 复制代码 代码如下: var name;//只是声明 var num = 11;//声明,并且赋值,即定义了 var password = "yangjiang";//声明,并且赋值,即定义了 下面是几点总结: 变量的作用域:全局的和局部的.(注意:如果尝试

  • 《javascript设计模式》学习笔记一:Javascript面向对象程序设计对象成员的定义分析

    本文实例讲述了Javascript面向对象程序设计对象成员的定义.分享给大家供大家参考,具体如下: 序: 刚接触javascript的时候,觉得这语言有点儿摸不着门道,感觉这玩意儿太难学了,没什么规范,没什么像样的手册,而且还跟html,dom,css打交道,更觉得一团糟,代码可读性也很差,面向过程的勉强能看懂,看面向对象的代码简直就是杯具,各种括号啊,后来了解ajax,了解了jquery,知道了很多网页特效都是用javascript写的,才慢慢有了好感,来了bd以后写javascript和ph

  • 整理Javascript基础入门学习笔记

    了解什么是变量? 变量是用于存储信息的容器 变量的声明 语法: var  变量名 变量名 = 值; 变量要先声明再赋值 变量可以重复赋值 变量的命名规则 变量必须以字母开头: 变量也能以$和_符号开头(不过我们不推荐这么做): 变量名称对大小写敏感(a和A是不同的变量). 1.语句 语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾. 有个好的编码习惯,都要以 ; 结尾 2.数据类型 在JavaScript中,一段信息就是一个值(value).值有不同的类型,大家最熟悉的类型是数字.字符

  • 整理Javascript流程控制语句学习笔记

    1.做判断(if语句) if语句是基于条件成立才执行相应代码时使用的语句. 语法: if(条件){ 条件成立时执行代码 } 例子:假设你应聘web前端技术开发岗位,如果你会HTML技术,你面试成功,欢迎加入公司. <script type="text/javascript"> var mycarrer = "HTML"; if (mycarrer == "HTML"){ document.write("你面试成功,欢迎加入公

  • JavaScript 学习笔记之变量及其作用域

    一.变量 ECMAscript变量是松散型变量,所谓松散型变量,就是变量名称可以保存任何类型的数据,每个变量仅仅是一个用于保存值的占位符. 定义:var firstDemo; 二.变量的作用域 2.1基本概念 使用var 定义变量:定义该变量的作用域的局部变量,这种定义变量的方法也被成为显式声明. 这么说不理解的话可以看看下面这个简单粗暴的例子: 复制代码 代码如下: test(); function test(){ var firstDemo="hello";//定义局部变量    

  • 整理Javascript基础语法学习笔记

    1.什么是变量 字面意思:变量是可变的量: 编程角度:变量是用于存储某种/某些数值的存储器.我们可以把变量看做一个盒子,盒子用来存放物品,物品可以是衣服.玩具.水果...等. 2.表达出你的想法(表达式) 表达式与数学中的定义相似,表达式是指具有一定的值.用操作符把常数和变量连接起来的代数式.一个表达式可以包含常数或变量. 字符串表达式:"I" + "love" + "you" + mychar  //编写串表达式,值为字符串. 数值表达式:nu

随机推荐