[label][JavaScript][The Defined Guide of JavaScript] 变量的作用域
一个变量的作用域(scope)是程序中定义这个变量的区域。
全局(global)变量的作用域(scope)是全局性的,即在JavaScript代码中,它处处都有定义。
而在函数之内声明的变量,就只在函数体内部有定义,它们是局部(local)变量,作用域是局部性的。
函数的参数也是局部变量,它们只在函数体内部有定义。
在函数体内部,局部变量的优先级比同名的局部变量高。
如果给一个局部变量或函数的参数声明的名字与某个全局变量的名字相同,那么就有效地隐藏了这个全局变量。
例如,下面的代码将输出单词"local scope":
var scope = 'global scope'; // Declare global variable
function checkScope() {
var scope = 'local scope'; // Declare a local variable with the same name
document.write(scope); // Use the local variable. not the global one
}
checkScope(); // Prints "local"
注意:在全局作用域中编写代码是可以不使用var语句,但是在声明局部变量时,一定要使用var语句。
没有块级作用域
JavaScript没有块级作用域,函数中声明的所有变量,无论是在哪里声明的,在整个函数中它们都是有
定义的。
下面代码中,变量i、j和k的作用域是相同的,它们三个在整个函数体中有定义。
funtion test(o) {
var i = 0; // i is defined throughout function
if(typeof o == "object") { // if block
var j = 0; // j is defined everywhere, not just block
for(var k = 0; k < 10; k++) { // k is everywhere, not just loop
document.write(k); // k is still defined: prints 10
}
}
document.write(j); // j is defined, but may not be initialized
}
// Example-2
var scope = 'global';
function f() {
alert(scope); // Displayed "undefine", not "global"
var scope = "local"; // Variable initialized here, but defined everywhere
alert(scope); // Displays "local"
}
//由于这个作用域规则的限制,第一个alert输出的并不是"global"。
//局部变量在整个函数体内都是有定义的,这就意味着在整个函数体中都隐藏了同名的全局变量。
//虽然局部变量在整个函数体中都是有定义的,但是在执行var语句之前,它是不会被初始化的。
因此上面的例子中,函数f和下面的函数等价:
function f() {
var scope; // 局部变量在函数开头声明
alert(scope); // 此处该变量有定义,但值仍为"undefined"
scope = 'local'; // 现在初始化该变量,并给它赋值
alert(scope); //此处该变量具有值
}
//这个例子说明了为什么将所有的变量声明集中起来放置在函数的开头是一个好的编程习惯。
以下内容来自:
http://www.cnblogs.com/wangfupeng1988/p/3986420.html
Code 1:
console.log(a); // variable a is undeclared and this will occure error reporting
Code 2:
console.log(a); // undefined , declare a variable in JavaScript and not assign a value. Then the variable's default value is undefined.
var a;
Code 3:
console.log(a); // undefied
var a = 10;
Code 4:
console.log(this); // 这里输出将会是window对象,window对象是一个全局的对象
Code 5:
console.log(f1); // function f1(){ }
function f1() { }; // 声明函数
Code 6:
console.log(f2) ; // undefined
var f2 = function f2() { }; // 函数表达式,这种方式产生的效果和变量的声明并赋值一样
注意: 学过C、Java都知道,在使用一个变量之前必须要先声明数据类型,如: int a;
同时,在声明变量的同时也可以初始化赋值,如: int a = 1001;
但是在程序的执行过程之中, 是先进行类型的声明的预处理,然后就是执行赋值,"="是赋值操作符。
[label][JavaScript][The Defined Guide of JavaScript] 变量的作用域的更多相关文章
- [label][JavaScript][The Defined Guide of JavaScript] 如何声明变量
因为觉得我自己的JavaScript基础很不扎实,或者可以说根本就没有所谓基础,所以就最近一直在看<The Defined Guide of JavaScript> . 在一边看的同时,我 ...
- JavaScript学习笔记(八)——变量的作用域与解构赋值
在学习廖雪峰前辈的JavaScript教程中,遇到了一些需要注意的点,因此作为学习笔记列出来,提醒自己注意! 如果大家有需要,欢迎访问前辈的博客https://www.liaoxuefeng.com/ ...
- 精读《javascript高级程序设计》笔记二——变量、作用域、内存以及引用类型
变量.作用域和内存问题 执行环境共有两种类型——全局和局部 作用域链会加长,有两种情况:try-catch语句的catch块,with语句. javascript没有块级作用域,即在if,for循环中 ...
- JavaScript高级程序设计学习(三)之变量、作用域和内存问题
这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...
- JavaScript基础笔记(二)变量、作用域和内存问题
变量.作用域和内存问题 一.基本类型和引用类型的值 基本类型值:简单的数据段 引用类型值:由多个值构成的对象 基本类型是按值访问的,引用类型是按引用访问的. 不能给基本类型的值添加属性,尽管不会报错. ...
- javascript高级程序设计第四章 变量、作用域和内存问题
变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是☞由多个值构成的对象 引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数 ...
- 【追寻javascript高手之路02】变量、作用域知多少?
前言 本来想把这个与上篇博客写到一起的,但是考虑到是两个知识点还是分开算了,于是我们继续今天的学习吧. 基本类型与引用类型 ECMAScript的的变量有两种类型: 基本类型(值类型):简单数据段 引 ...
- 《JavaScript高级程序设计》读书笔记 ---变量、作用域和内存问题小结
JavaScript 变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型的值源自以下5种基本数据类型:Undefined.Null.Boolean.Number 和String.基本类型值 ...
- 《JavaScript高级程序设计》笔记:变量、作用域和内存问题(四)
基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段,而引用类型的值指那些可能有多个值构成的对象. 动态的属性 var p ...
随机推荐
- ruby的代码风格
http://stylesror.github.io/ 大部分同意,有小部分,不敢苟同.
- webpack和webpack-dev-server安装配置
本文转载自:https://www.cnblogs.com/xuehaoyue/p/6410095.html 跟着Webpack傻瓜式指南(一)这个教程在安装webpack和webpack-dev-s ...
- p3新式类__new__使用和实例化
嗯,new方法返回的是一个全新的对象是真正在内存中分配的内存地址 示例1·class Foo(object): # __metaclass__ = MyType def __init__(self, ...
- 图片采集器_PHP
现在国内模仿“pinterest”的越来越多了,之前我做过一个基于chrome浏览器上的一个“图片采集工具”,类似于“花瓣网“那样的,初期我觉得挺简单,后来做起来发现还是挺复杂的,特别是整合到你自己的 ...
- Solr分组聚合查询之Facet
摘要: Solr的分组聚合是一个笼统的概念,目的就是把查询结果做分类,有多种方式可以做到很类似的结果.也正是由于它们的不同表现,可以适合于多种场景. 何为Facet Facet是一种手段,用来将搜索结 ...
- [译]作为一个web开发人员,哪些技术细节是在发布站点前你需要考虑到的
前日在cnblogs上看到一遍文章<每个程序员都必读的12篇文章>,其中大多数是E文的. 先译其中一篇web相关的”每个程序员必知之WEB开发”. 原文: http://programme ...
- struct to point
关键知识点:结构体--新数据类型定义及结构体变量的定义与初始化, 结构体指针变量的定义及相关应用. 结构体变量作函数参数 指向结构体变量的指针变量. 数组与结构体间的渊源始末, 当一个整体由多个数据构 ...
- 关于微信小程序的一些看法和理解
最近做了几个小时的调研,微信小程序 微信小程序是可以理解成在微信中的APP,他的目标是APP的替代者,由于目前的APP主要区分安卓和IOS,或者其他平台, 那么微信小程序的平台在微信,在任何一个手机系 ...
- leetcode116
class Solution { public: void connect(TreeLinkNode *root) { if (root != NULL) { queue<TreeLinkNod ...
- Spring security 3.1 +JSF 2.0 . problem with annotating methods in ManagedBeans?
Hy .What i am trying to do is to integrate Spring security with a Jsf+spring IOC +hibernate applicat ...