JavaScript权威指南__第三章
来源:互联网 发布:javascript初级视频 编辑:程序博客网 时间:2024/04/29 16:26
第三章:类型、值和变量
3.1~3.9lue
3.10:变量作用域
- JavaScript中在函数内部定义的变量属于
局部变量
只在函数内部有定义;- 函数参数也是局部变量,只在函数内有定义;
- 在函数体内
局域变量
的优先级高于同名的全局变量,如果在一个函数内声明一个局部变量或者函数参数中带有的变量和全局变量重名,则全局变量被局部变量覆盖;
var scope = "global"; // 声明一个全局变量function checkscope() { var scope = "local"; // 声明一个与全局变量同名的局部变量 return scope;}checkscope(); // => "local"
- 在全局作用域中定义变量时可以不使用
var
, 但声明局部变量时必须使用var
语句:
scope = "global"; // 声明一个全局变量,可以不使用var来声明function checkscope2() { scope = "local"; // 此处不是声明变量,而是修改了全局变量 myscope = "local"; // 显式的声明一个新的全局变量 return [scope, myscope]; // 返回两个值}checkscope2(); // => ["local", "local"]
- 当嵌套的定义函数时,会出现局部作用域的嵌套情况:
var scope = "global scope"; // 全局变量function checkscope() { var scope = "local scope"; // 局部变量 function nested() { var scope = "nested scope"; // 嵌套作用域内的局部变量 return scope; // 返回当前作用域内的值 } return nested();}checkscope(); // => "嵌套作用域"
3.10.1:函数作用域和声明提前
- 函数作用域:JavaScript中没有块作用域,所以在if代码块或for代码块中声明的变量在整个函数中都有定义,甚至可以在变量声明前就可以使用
function test(o) { var i = o; // i在整个函数中都有定义 if(typeof i == "object") { var j = 0; // j在整个函数内都有定义,在j声明之前也可以使用 for(var k=0; k<10; k++) { // k在整个函数内部都有定义,同上; console.log(k); // 输出0~9 } console.log(k); // 此处k已经定义,输出10 } console.log(j); // j已经定义,但可能没有初始化}
- 声明提前:函数内部声明的变量(包括if代码块和for代码块中)都被“提前”到函数体的顶部
var scope = "global";function f() { console.log(scope); // 输出undefined,不是“global”,因为下一行什么的scope将全局变量scope覆盖掉,所以此处的scope是下面声明的scope而不是上面的全局变量,但此时该局部变量尚未初始化,所以输出undefined var scope = "local";// 变量在函数体内部都有定义 console.log(scope); // 输出local}// 以上代码等价于下面的代码function f() { var scope; // 在函数顶部声明了局部变量 console.log(scope);// 变量存在,但未初始化,其值为“undefined” scope = "local"; // 此处将其初始化赋值 console.log(scope); // 输出“local”}
3.10.2:作为属性的变量
- 当声明一个JavaScript全局变量时,实际上是定义了全局对象的一个属性,当使用var声明一个变量时,创建的这个属性是不可匹配的,即该变量无法通过delete运算符删除,如果没有使用严格模式并给一个未声明的变量赋值的话,JavaScript会自动创建一个全局变量,这种方式创建的变量时全局对象的正常的可匹配属性,并可以删除;
var truevar = 1; // 声明一个不可删除的全局变量fakevar = 2; // 创建全局变量的一个可删除的属性this.fakevar2 = 3; // 同时delete truevar; // => false; 变量不可删除delete fakevar; // => true;变量被删除delete this.fakevar2;// => true; 变量被删除
- javascript 中全局变量就是全局对象的属性,可以使用this关键字来引用全局对象;但是却没有办法来引用存放局部变量的对象,这是通过不可见的内部实现的,但这种局部变量对象存在的观念是非常重要的,见下一节.
3.10.3:作用域链
- 全局变量在程序中始终都有定义的;
局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的;
作用域链:将JavaScript代码的全局对象看做一个链表,当加载到全局变量时存放到链表的一个元素中,但加载到一个函数时将该函数加载到链表的一个元素中,在调用某一个变量时,从链表的第一个元素开始查找,如果遇到则使用,如果没有则查找下一个,如果是函数则查找函数中的变量看是否存在;
0 0
- JavaScript权威指南__第三章
- JavaScript权威指南__第七章:数组
- 802.11无线网络权威指南读书笔记__第三章802.11MAC(1)
- JavaScript权威指南 第三章 类型 值和变量
- javaScript权威指南 第六版 第三章 笔记
- Javascript权威指南第三章读后小笔记
- javascript权威指南--第七章
- JavaScript基础学习之-JavaScript权威指南-第三章类型、值和变量
- JavaScript基础学习之-JavaScript权威指南-第三章类型、值和变量(2)
- Asterisk权威指南/第三章 安装Asterisk
- HTML5权威指南之—第三章
- Hadoop权威指南 第三章笔记
- netty权威指南 ---------第三章 入门应用
- Hadoop权威指南第三章笔记
- Netty权威指南读书笔记-第三章
- css权威指南(第三章)笔记
- HTTP报文(http权威指南第三章)
- VUE权威指南-第三章 指令
- android之ConnectivityManager简介,网络连接状态
- tomcat集群机制剖析及其生产部署选型
- SecureCRT 常用技巧
- chdir,fchdir,and getcwd Functions
- MD5加密
- JavaScript权威指南__第三章
- scala------ 类和对象
- 读取单条json数据代码
- 个人建议不要用number_formart保留两位小数
- vagrant学习笔记 - Vagrantfile
- Hadoop1.2.1 tasktracker容错机制分析,黑名单与灰名单
- FastReport设置0值打印时为空白
- Socket send函数和recv函数详解
- 浅谈最小生成树的算法思路(二)Kruskal算法