【Javascript系列】变量作用域
问题描述
本篇文章主要讲解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系列】变量作用域的更多相关文章
- [转]深入理解JavaScript的变量作用域
1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...
- 深入理解JavaScript的变量作用域(转载Rain Man之作)
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- JavaScript函数变量作用域
变量作用域 在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量. 如果两个不同的函数各自申明了同一变 ...
- Javascript之变量作用域
分析: 无论是强类型语言c#.c++.java等语言,还是弱类型语言如Javascript,所有变量可以抽象为两种类型,即局部变量和全局变量. 全局变量:整个作用域可见. 局部变量:局部可见,退出作用 ...
- javascript的变量作用域--对比js、php和c的for循环
为什么要写这篇文章呢?主要是给自己提个醒,js的水很深,需要小心点儿才能趟过去,更何况自己不是专业人士,那就得更加小心了. 看下面的js代码: <!DOCTYPE html> <ht ...
- JavaScript 关于变量作用域的一道面试题
ShineJaie 原创,转载请注明出处. 昨晚在一个交流群里看到有位网友提了一个他的面试题求助答疑.刚好我也有看到,就对这个问题思考了一下,觉得这道题对理解 JavaScript 作用域还是很有帮助 ...
- 浅谈javascript中变量作用域和内存(2)
1.无块级作用域 javascript没有块级作用域,这会让其他程序员在理解js代码上很痛苦.在其他很多语言,比如C,大括号括起来的代码块都有自己的作用域 举个例子 if(true) { var na ...
- JavaScript的变量作用域
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 浅谈javascript的变量作用域
1.变量遵循先声明再使用. console.log(b); b=123; 代码运行结果: Uncaught ReferenceError: b is not defined 2.方法内定义的局部变量外 ...
随机推荐
- linux下PythonQt混编记录
看了很多博主经验,然后自己实验总结出来的,就不一一写出处了,非常感谢各位博主的分享经验. 一.安装Python3.6 安装依赖环境 # yum -y install zlib-devel bzip2- ...
- sjms-4 行为型模式
行为型模式 责任链模式 内容:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止.角色:抽象处理者(Hand ...
- 1030 Travel Plan Dijkstra+dfs
和1018思路如出一辙,先求最短路径,再dfs遍历 #include <iostream> #include <cstdio> #include <vector> ...
- [转]数据库中间件 MyCAT源码分析——跨库两表Join
1. 概述 2. 主流程 3. ShareJoin 3.1 JoinParser 3.2 ShareJoin.processSQL(...) 3.3 BatchSQLJob 3.4 ShareDBJo ...
- Javascript Engine, Java VM, Python interpreter, PyPy – a glance
提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...
- 小白Monkey学习笔记
Monkey是google提供的一款对Android app进行压力测试工具,基于随机坐标位置,进行点击.滑动.输入等操作. Monkey的环境配置 pc电脑需要配置adb环境 Monkey程序由An ...
- sqoop错误集锦2
1.使用sqoop技术将mysql的数据导入到Hive出现的错误如下所示: 第一次使用命令如下所示: 1 [hadoop@slaver1 sqoop-1.4.5-cdh5.3.6]$ bin/sqoo ...
- Collection类,泛型
Collection(接口) 所有超级接口: Iterable<E> 一.集合 1.集合的介绍&集合和数组的区别 什么是集合:java中的一种容器 什么是数组:java中的一种容器 ...
- jQuery常用选择器总结
jQuery常用选择器总结: 我们都知道jQuery是JavaScript(JS)的框架,它的语法简单使用方便,被广大开发人员青睐.现在我就它常用的并且十分强大的选择器的方式,做一个总结.鉴于它的选择 ...
- 为什么我们要使用int类型来保存时间类型的数据。
1.如果数据保存的是timestamp类型那么,如果某个服务器系统时区配置错误,那么悲剧的是通过该服务器写入的时间都是有偏差的. 如果使用int类型保存unix时间戳的话,那么就是在前端展示的时候转 ...