问题描述

本篇文章主要讲解javascript变量及其作用域。

1   内容区

在js中,变量大致可分为全局变量(全局作用域)和局部变量(局部作用域);

用关键字var定义变量(全局变量,可以省略var关键字,但局部变量不建议这么做,否则容易造成全局变量被覆盖或者重写)

1.1   变量声明

当只是声明变量,但未给变量赋值时,则默认值为undefined

fucntion f(){
var varParam;
console.log(varParam);//undefined
} f();

1.2  当全局变量与局部变量重名时,局部变量覆盖全局变量

var  Scrope="Global  Scrope";//全局变量
function f(){ 
var Scrope="Local Scrope";//局部变量
console.log(Scrope);//Local Scrope
}

1.3  局部变量省略var,造成全局变量被覆盖

var  Scrope="Global  Scrope";//全局变量
function f(){
Scrope="Local Scrope";//局部变量定义省略var关键字,造成覆盖全局变量内容(重写全局变量)
console.log(Scrope);//Local Scrope
}

1.4  作用域嵌套

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

1.5  函数作用域

在一些类似c语言的编程语言中,花括号内的每一段代码都具有各自的作用域,而且变量在声明它们的代码之外是不可见的,我们称之为块级作用域(block scope),但JavaScript中没有块级作用域,用函数作用域(function scope)代替。

JavaScript的函数作用域是指在函数内声明的所有变量在函数体内始终是可见的。

function test(o){
var i=0;//i在整个函数体内均是有定义的
if(typeof 0=="object"){
var j=0;//j在函数体内是有定义的,不仅仅是在这个代码段内
for(var k=0;k<10;k++){//k在函数体内是有定义的,不仅仅是在循环体内
console.log(k);//输出0~9
}
console.log(k);//k已经定义了,输出10
}
console.log(j);//j已经定义了,但可能没初始化
}

1.6  变量声明提前

由于JavaScript中,函数内声明的所有变量在函数体内始终是可见的,这意味着变量在声明前甚至已经可用,这个特性被非正式地称为声明提前(hoisting),即JavaScript函数里的声明的所有变量(但不涉及赋值)都被“提前”至函数体的顶部。

 var scope="gloabal";
function f(){
console.log(scope);//输出“undefined“,而不是”global”
var scope="local";//变量在这里赋初始值,但变量本身在函数体内任何地方均是有定义的
console.log(scope);//输出“local”
}

如上代码等价于如下代码

 var scope="gloabal";
function f(){
var scope;//在函数顶部声明了局部变量,覆盖了全局变量
console.log(scope);//变量存在,其值是 undefined
scope="local";//将变量初始化,并赋值
console.log(scope);//输出“local”
}

1.7  在函数内定义全局变量

//全局变量
function AllVary() {
n = 10 //表示全部变量,外部可访问
}
PartVary();
alert(n);//

错误的定义

//全局变量
function AllVary() {
var n = 10 //表示全部变量,外部可访问
}
PartVary();
alert(n);//error

1.8  作为属性的变量

待续。。。。

1.9  作用域链

待续。。。。

2  参考文献

【01】《JavaScript权威指南》(第六版)  (美)David.Flanagan

3  版权区

  • 感谢您的阅读,若有不足之处,欢迎指教,共同学习、共同进步。
  • 博主网址:http://www.cnblogs.com/wangjiming/。
  • 极少部分文章利用读书、参考、引用、抄袭、复制和粘贴等多种方式整合而成的,大部分为原创。
  • 如您喜欢,麻烦推荐一下;如您有新想法,欢迎提出,邮箱:2016177728@qq.com。
  • 可以转载该博客,但必须著名博客来源。

Javascript之变量作用域的更多相关文章

  1. [转]深入理解JavaScript的变量作用域

    1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...

  2. 深入理解JavaScript的变量作用域(转载Rain Man之作)

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  3. 深入理解JavaScript的变量作用域

    在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...

  4. JavaScript函数变量作用域

    变量作用域 在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量. 如果两个不同的函数各自申明了同一变 ...

  5. javascript的变量作用域--对比js、php和c的for循环

    为什么要写这篇文章呢?主要是给自己提个醒,js的水很深,需要小心点儿才能趟过去,更何况自己不是专业人士,那就得更加小心了. 看下面的js代码: <!DOCTYPE html> <ht ...

  6. JavaScript 关于变量作用域的一道面试题

    ShineJaie 原创,转载请注明出处. 昨晚在一个交流群里看到有位网友提了一个他的面试题求助答疑.刚好我也有看到,就对这个问题思考了一下,觉得这道题对理解 JavaScript 作用域还是很有帮助 ...

  7. 浅谈javascript中变量作用域和内存(2)

    1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...

  8. JavaScript的变量作用域

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. 浅谈javascript的变量作用域

    1.变量遵循先声明再使用. console.log(b); b=123; 代码运行结果: Uncaught ReferenceError: b is not defined 2.方法内定义的局部变量外 ...

随机推荐

  1. html5 canvas常用api总结(三)--图像变换API

    canvas的图像变换api,可以帮助我们更加方便的绘画出一些酷炫的效果,也可以用来制作动画.接下来将总结一下canvas的变换方法,文末有一个例子来更加深刻的了解和利用这几个api. 1.画布旋转a ...

  2. PHP源码分析-变量

    1. 变量的三要素变量名称,变量类型,变量值 那么在PHP用户态下变量类型都有哪些,如下: // Zend/zend.h #define IS_NULL 0 #define IS_LONG 1 #de ...

  3. [C#] string 与 String,大 S 与小 S 之间没有什么不可言说的秘密

    string 与 String,大 S 与小 S 之间没有什么不可言说的秘密 目录 小写 string 与大写 String 声明与初始化 string string 的不可变性 正则 string ...

  4. Android Studio —— 重装 HAXM

    Android Studio -- 重装 HAXM 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 文中如有纰漏,欢迎大家留言指出. Android SDK 自带模拟器一直以慢.卡 ...

  5. 问题记录:EntityFramework 一对一关系映射

    EntityFramework 一对一关系映射有很多种,比如主键作为关联,配置比较简单,示例代码: public class Teacher { public int Id { get; set; } ...

  6. js学习之变量、作用域和内存问题

    js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...

  7. VS2015在创建项目时的一些注意事项

    一.下面是在创建一个新的项目是我最常用的,现在对他们一一做一个详细的介绍: 1.Win32控制台应用程序我平时编写小的C/C++程序都用它,它应该是用的最多的. 2.名称和解决方案名称的区别:名称是项 ...

  8. 【干货分享】流程DEMO-人员调动流程

    流程名: 调动 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单:  流程:  图片:3.png DEMO包下载: http://files.cnblogs.com ...

  9. android计算每个目录剩余空间丶总空间以及SD卡剩余空间

    ublic class MemorySpaceCheck { /** * 计算剩余空间 * @param path * @return */ public static String getAvail ...

  10. js实现四大经典排序算法

    为了方便测试,这里写了一个创建长度为n的随机数组 function createArr(n) { var arr = []; while (n--) { arr.push(~~(Math.random ...