js里变量的作用域
一、在js中,变量的定义并不是以代码块作为作用域的,而是以函数作为作用域。也就是说,如果变量是在某个函数中定义的,那么,它在函数以外的地方是不可见的。但是,如果该变量是定义在if或者for这样的代码块中,它在代码块之外是可见的。
二、在js中,术语“全局变量”指的是定义在所有函数之外的变量(也就是定义在全局代码中的变量),与之相对的是“局部变量”,所指的是在某个函数中定义的变量。其中,函数内的代码可以像访问自己的局部变量那样访问全局变量,反之则不行。
三、下面是具体示例,请注意两点:
1> 函数f()可以访问变量global。
2> 在函数f()以外,变量local是不存在的。
var global = 1;
function f() {
var local = 2;
global ++;
return global;
}
测试结果如下:
还有一点要注意:如果我们声明一个变量事没有使用var语句,该变量就会被默认为全局变量。让我们来看一个示例:
function f () {
local = 2;
}
undefined
local;
VM432:1 Uncaught ReferenceError: local is not defined
f();
undefined
local;
2
图:
我们来看上面代码发生了什么:首先,我们在函数f()中定义了一个变量local。在该函数被调用之前,这个变量并不存在。该变量会在函数首次被调用时创建,并被赋予全局作用域。这使得我们可以在该函数以外的地方访问它。
四、最佳实践:
1>尽量将全局变量的数量降到最低,以避免命名冲突。
2>最好总是使用var语句来声明变量。
3>可以考虑使用“单一var”模式,即,仅在函数体内的第一行使用一个var来定义这个作用域中所有需要的变量。这样一来,我们就能很轻松地找到相关变量的定义,并且在很大程度上避免了不小心污染全局变量的情况。
五、变量提升
举例:
var a = 123;
function f(){
alert(a);
var a = 1;
alert(a);
}
f();
图:
你可能会想当然的认为alert()第一次显示的是123(即全局变量a的值),而第二次显示的是1(即局部变量a)。但事实并非如此,第一个alert()实际上显示的是undefined,这是因为函数域始终优先于全局域,所以全局变量a会覆盖掉所有与它同名的全局变量,尽管在alert()第一次被调用时,a还没有被证实定义(即,该值是undefined),但该变量本身已经存在于本地空间了。这种特殊的现象叫做提升。
结果如图:
也就是说,当js执行过程进入新的函数时,这个函数内被声明的所有变量所有变量都会被移动(或者说提升)到函数最开始的地方。另外,需要注意,被提升的只有变量的声明,这意味着,只有函数体内声明的这些变量在该函数执行开始时就存在,而与之相关的赋值操作并不会被提升,它还在原来的位置上。譬如,在原来的例子中,局部变量本身被提到了函数开始处,但并没有在开始处就被赋值为1。这个例子可以被等价地改写为:
当然,我们可以采用最佳实践中提到过的单一var模式。在这个例子中,我们可以手动提升变量声明的位置,这样一来代码就不会被js的提升行为所混淆了。
js里变量的作用域的更多相关文章
- js之变量和作用域
JS的变量和其他语言的变量有很大区别.JS变量时“松散型”的,决定它只是在特定时间用于保存特定的一个名字而已.由于不存在变量要保存何种数据类型,变量的值和其数据类型可以在脚本的生命周期内改变. JS两 ...
- JS中变量、作用域的本质,定义及使用方法
全局作用域和局部作用域 全局作用域 局部作用域:函数作用域 全局作用域在全局和局部都可以访问到,局部作用域只能在局部被访问到 var name="cyy"; function fn ...
- Js中变量的作用域
一.理解函数作用域需要理解以下几点: 1.函数变量的作用域有全局变量和局部变量两种,全局变量写在函数的最前面,局部变量写在函数体内,局部变量省略了var 也就默认成为了全局变量! 2.函数 ...
- 有关js的变量、作用域和内存问题
来自<javascript高级程序设计 第三版:作者Nicholas C. Zakas>的学习笔记(四) js共有5种基本数据类型:Undefined.NULL.Boolean.Numbe ...
- JS:变量的作用域
1.作用域: 指一个变量它在哪些代码范围能够被使用,这些地方就是变量的作用域 JS中的两种作用域: 1.全局作用域.2.函数作用域 2.在es5中 函数的代码块内部的代码 可以访问形参变量 也可 ...
- Js的变量、作用域与内存
变量.作用域与内存 1 .原始值与引用值 Undefined.Null.Boolean.Number. String和Symbol.保存原始值的变量是按值(by value)访问的 引用值是保存在内存 ...
- js中变量的作用域、变量提升、链式作用域结构
一:作用域 在ES6之前,javascript没有块级作用域(一对{}即为一个块级作用域),只有全局作用域和函数作用域(局部),因此,对应的有全局变量和局部变量.在函数内部可以访问到全局变量,但在函数 ...
- 关于JS中变量的作用域-实例
先看问题,如下,自己运行一下吧! if (!('_qyzA' in window)) { var _qyzA = 1; } alert(_qyzA);//undefined 分析:首先,所有的全局变量 ...
- 关于JS里的函数作用域链的总结
在JavaScript中,函数的作用域链是一个很难理解的东西.这是因为JavaScript中函数的作用域链和其他语言比如C.C++中函数的作用域链相差甚远.本文详细解释了JavaScript中与函数的 ...
随机推荐
- KoaHub.js -- 基于 Koa.js 平台的 Node.js web 快速开发框架之koahub-loader
koahub loader Installation $ npm install koahub-loader Use with koa // 1.model loader var model = ...
- 2435: [Noi2011]道路修建
2435: [Noi2011]道路修建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2188 Solved: 639[Submit][Status ...
- netflix zuul 学习
netflix zuul 是netflix开发的一个EDGE SERVICE. 主要是作为一个API Gateway 服务器,可以实现安全,流量控制等功能. 我看的是1.x的版本,Zuul1.x的实现 ...
- Android之万能播放器解码框架Vitamio的介绍及使用
一.简介 Vitamio能够流畅播放720P甚至1080P高清MKV,FLV,MP4,MOV,TS,RMVB等常见格式的视频,还可以在Android 与 iOS 上跨平台支持 MMS, RTSP, R ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结
不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...
- 手把手教你怎么搭建angular+gulp的项目(一)
大多时候,我们要学习一个新东西,不是不肯去学,而是不知道该如何开始.比如学angular,我要怎么开始学?怎么应用到自己项目中?这篇文章就是我根据自己边学习边应用,构建一个项目的切身体会,来讲下怎么开 ...
- 【微信公众平台SDK(链式调用)】经过半个月的迭代,今天抽空写了个Demo
这个项目是在实际开发中逐渐完善的,开发过程基于ASP.Net Core 1.1,实际生成会兼容Net4.5. 写有完善的代码提示,怎么用就不多做解释了,引用好实例中的命名空间基本上就可以通过智能提示了 ...
- 在Chrome中安装PostMan用来测试SpringBoot程序
1. 首先下载一个PostMan的插件,Postman_v4.1.3.crx 下载下来为这种类型的文件. 2. 在Chrome中输入chrome://extensions/ 这个,打开Chrome的扩 ...
- scrapy学习笔记
1.scrapy用哪条命令行重新编辑已有的项目?cd projectname 2.如何在pycharm中开启scrapy?先在终端创建一个项目(即文件夹),再在pycharm中打开.
- 【iOS】7.4 定位服务->2.1.3.1 定位 - 官方框架CoreLocation 功能1:地理定位
本文并非最终版本,如果想要关注更新或更正的内容请关注文集,联系方式详见文末,如有疏忽和遗漏,欢迎指正. 本文相关目录: ================== 所属文集:[iOS]07 设备工具 === ...