问题描述

本篇文章主要讲解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之变量作用域

    分析: 无论是强类型语言c#.c++.java等语言,还是弱类型语言如Javascript,所有变量可以抽象为两种类型,即局部变量和全局变量. 全局变量:整个作用域可见. 局部变量:局部可见,退出作用 ...

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

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

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

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

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

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

  9. JavaScript的变量作用域

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

  10. 浅谈javascript的变量作用域

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

随机推荐

  1. Git使用(一、TortoiseGit和Gitlab在Windows下的项目库创建和上传)

    介绍使用TortoiseGit初次创建并上传到gitlab项目库,转载请注明出处. 一.需要先安装git环境,并配置Git用户名及邮箱. 二.用PuTTYgen生成公约私钥对(鼠标画画).PuTTYg ...

  2. 2019/3/7 Java学习之多线程(基础)

    Java学习之多线程 讲到线程,就必须要懂得进程,进程是相当于一个程序的开始到结束,而线程是依赖于进程的,没有进程,就没有线程.线程也分主线程和子线程,当在主线程开启子线程时,主线程结束,而子线程还可 ...

  3. Android 极光推送造成IM服务绑定失败bug

    由于极光推送对8.0的支持问题,升级到了最新版本的极光推送.但是最新版本的极光推送,默认将推送服务设置到了新的进程里面,由此引发 Android 极光推送多进程造成的application运行两次 和 ...

  4. 《python语言程序设计》_第二章编程题

    2.1 程序: Celsius=eval(input("Enter a degree in Celsius:"))#输入摄氏度的值Celsiusfahrenheit =(9/5)* ...

  5. [ 10.08 ]CF每日一题系列—— 602B

    Description: 一个数组,保证相邻两个元素值得差小于1,问题,最大值和最小值的差 < 1的区间长度最长是多少 Solution: 还是卡了一下,本来以为是模拟就好了,但是卡时间,想来想 ...

  6. keepalived给LVS带来了什么

    LVS+Keepalived 1>Keepalived简介  Keepalived是Linux下一个轻量级别的高可用解决方案,高可用(High Avalilability,HA),其实两种不同的 ...

  7. Redis-02.数据类型

    Redis中所有数据都是以key-value存储的,value支持的数据类型包括string.hash.list.set.sorted_set 数据类型 string 是redis最基本的类型,一个k ...

  8. 背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知)

    [源码下载] 背水一战 Windows 10 (118) - 后台任务: 后台下载任务(任务分组,并行或串行执行,组完成后通知) 作者:webabcd 介绍背水一战 Windows 10 之 后台任务 ...

  9. AngularJS 四大特性

    1.模块化 2.双向数据绑定 3.依赖注入 4.mvc模式

  10. 脑残式网络编程入门(三):HTTP协议必知必会的一些知识

    本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...