读书笔记——javascript变量作用域

《JavaScript权威指南》第6版第三章第10节:


一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。然而在函数内声明的变量只在函数体内有定义。它们是局部变量,作用域也是局部的。函数参数也是局部变量,它们只在函数体内有定义。

  在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或函数参数中带有的变量和全局变量重名,那么全局变量就被局部变量所遮盖。

var scope = "global";    //声明一个全局变量
function checkscope(){
    var scope = "local";    //声明一个同名的局部变量
    return scope;    //返回局部变量的值,而不是全局变量的值
}
checkscope();    // ==>"local"

尽管在全局作用域编写代码时可以不写var 语句,但声明局部变量时则必须使用var。如:

scope = "global";    //声明一个全局变量,不用var
function checkscope(){
    scope = "local";    //糟糕!我们刚修改了全局变量的值!
    myscope = "local";  // 这是显式声明了一个新的全局变量
    return [scope,myscope];    // 返回两个值
}
checkscope();    // ==>["local","local"]:产生了副作用
scope;           //"local":全局变量修改了
myscope;         //"local":全局命名空间搞乱了

函数定义是可以嵌套的,由于每个函数都有它自己的作用域,因此会出现几个局部作用域嵌套的情况:

var scope = "global scope";//全局变量
function checkscope(){
var scope = "local scope";//局部变量
function nested(){
var scope = "nested scope";//嵌套作用域内的局部变量
return scope;              //返回当前作用域内的值
}
       return scope+","+nested();
}
console.log(scope+"|"+checkscope());   //==>global scope | local scope , nested scope

3.10.1 函数作用域和声明提前:

在JavaScript中,没有块级作用域的概念,取而代之的是函数作用域(funciton scope):变量在声明它们的函数体以及这个函数体嵌套的任意函数体内都是有定义的。JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的——这意味着变量在声明之前甚至已经可用。JavaScript的这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里声明的所有变量(但不涉及赋值)都被提前到函数体的顶部。

var scope = "global";//全局变量
(function f(){
console.log(scope);    //==>"global"
}());

再对比一下:

var scope = "global";//全局变量
(function f(){
console.log(scope);    //==>undefined
var scope = "local";
console.log(scope);    //==>"local"
}());

为什么呢?——因为,局部变量scope的声明被提前了,但是赋值没有被提前,所以,以上代码相当于:

var scope = "global";//全局变量
(function f(){
var scope;             //声明局部变量scope,此时没有赋值
console.log(scope);    //==>undefined
scope = "local";       //给局部变量scope赋值
console.log(scope);    //==>"local"
}());

3.10.2 作为属性的变量

当声明一个JavaScript全局变量时,实际上定义了全局对象的一个属性,当使用var声明一个变量时,创建的这个属性是不可配置的,也就是说这个变量无法通过delete运算符删除。但有一种特殊情况:如果没有使用严格模式并给一个未声明的变量赋值的话,JavaScript会自动创建一个全局变量,以这种方式创建的变量是全局对象的可配置值属性并可以删除它们:

var truevar = 1;       //声明一个不可删除的全局变量
fakevar = 2;//创建全局对象的一个可删除的属性
this.fakevar2 = 3;//同上
console.log( delete truevar);//==>false
console.log( delete fakevar);//==>true
console.log( delete fakevar2);//==>true
时间: 04-19

读书笔记——javascript变量作用域的相关文章

JavaScript语言精粹读书笔记- JavaScript对象

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collections). 对象是属性的容器,其中每个属性都拥有名字和值. JavaScript中的对象是无类别的(class-free)的.它对新属性的名字和值没有约束. JavaScript包括一个原型链特性,允许对象继承另一对象的属性. 对象的检索: stooge[“first-name”]或者stooge.

第一百零六节,JavaScript变量作用域及内存

JavaScript变量作用域及内存 学习要点: 1.变量及作用域 2.内存问题 JavaScript的变量与其他语言的变量有很大区别.JavaScript变量是松散型的(不强制类型)本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 一.变量及作用域 1.基本类型和引用类型的值 ECMAScript变量可能包含两种不同的数据类型的值:基本类型值和引用类型值.基本类型值指的是那些保存在栈

读书笔记----JavaScript 权威指南(一)

0.前言 最近小编我刚刚结束上一段的工作,结果立马就马不停蹄的开始了新一轮的工作了,表示无辜,(o′?ェ?`o),程序猿真是个累死人不偿命的工作呀. 今天晚上看到同事新启封的 JavaScript 权威指南,心血来潮的想,如果我能把这个书里面的重点以及具体知识点梳理出来,那么后来的人是不是就能少走一些弯路呢? 抱着这个想法,于是就开始了今天晚上的读书之旅,更由于小编喜欢整理东西这个习惯,才有了此文. 真心希望看到这篇文章的你,能够感受到小编那深沉的爱!~ 1.JavaScript 语法核心 之

深入浅出JavaScript变量作用域

在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域.赌王娱乐城 函数中声明的变量在整个函数中都有定义. 1.JavaScript的作用域链 首先看下下面这段代码: <script type="text/javascript"> var rain = 1;     function rainman(){     var man = 2;     function inn

深入理解JavaScript变量作用域

JS变量作用域特点: a.JS变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c.函数中声明的变量在整个函数中都有定义. 1.作用域链 var rain = 1 ; function rainman(){ var man = 2 ; function inner(){ var innerVar = 4; alert(rain); } inner(); // 调用inner函数 } rainman(); // 调用rainman函数 观察alert(rain);这句

JavaScript变量作用域

全部变量拥有全局作用域,局部变量拥有局部作用域(这里注意函数的参数也是局部变量) 1.在函数体内,局部变量的优先级高于同名的全局变量. 我的理解就是当你同时定义了同名的局部变量和全局变量时,函数体内返回的将是局部变量的值. 例如: var scope="我是全局变量"; function checkscope(){ var scope="我是局部变量"; console.log(scope); } checkscope(); 输出:我是局部变量 这里需要注意的是,在

JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量.变量可以是局部或者全局性的,但在子范围中定义的变量是可以访问父范围的,这一点可能会造成一些困扰. 在JavaScript中使用"var"关键字声明变量.一旦在父范围宣声明,就会作为各自子范围的一部分.即在本地范围内有效,但本地定义的变量不可在全局范围内访问. 让我们来看一个例子.执行下面

javascript变量作用域与内存

第四章 变量作用域与内存基本类型 5种Undefined Null Boolean Number String 两种变量类型 基本类型与引用类型注意:String 再其他语言中是引用类型,再javascri中为基本类型即:这五种基本类型是按值访问的 引用类型是按照引用访问的 动态的属性对于一个引用类型,一个引用变量被赋值后,可以为其添加属性,也可以删除与修改其属性var o = new object();o.name = "qi"; //可以为引用变量添加属性 变量的复制基本类型的复制

JavaScript变量作用域和内存问题(js高级程序设计总结)

1,变量 ECMAScript和JavaScript是等同的吗?个人认为是否定的.我的理解是这样的,ECMAScript是一套完整的标准或者说协议,而JavaScript是在浏览器上实现的一套脚本语言.也就是说,ECMAScript是JavaScript的父类标准.JavaScript是ECMAScript的具体实现.所有ECMAScript定义的数据类型或者语言特性实际上都是伪代码的形式规定的.当然如果可以,ECMAScript也可以有服务器实现,单片机实现(不一定恰当).如果说ECMAScr