JavaScript(1)——变量、函数声明及作用域
这是我的第一篇博客文章,本人不才,文笔也不好,所以可能写的有点凌乱。有什么不对的地方还望见谅。不过每天进步一小步,总有一天会迈出那一大步。以下内容是我对变量、函数声明及函数表达式、作用域的理解。
【变量】
大意上来讲,变量就是所定义的一个可以用来保存值的占位符。定义变量时要使用var操作符。
变量所保存类型可以被改变,但不建议。
var操作符定义的变量将成为该变量的作用域中的局部变量,在函数退出后,变量将被销毁。
若省略var操作符可以定义全局变量,不过在严格模式下会导致抛出ReferenceError错误。
用一条语句可以定义多个变量,只要把每个变量用逗号分开即可。
如:var massage="hi",
found=false;
在严格模式下,不能定义名为eval或arguments的变量,会导致语法错误。
【函数声明及函数表达式】
函数:被定义一次,可执行和调用多次,JS中的函数也是对象,JS函数可以像其他对象那样操作和传递。
常见的两种创建函数的方法:函数声明跟函数表达式。
函数声明:一个完整的语句以function开头,不加任何东西。如:function 函数名(参数){函数体}
函数表达式:有四种表现形式。把一个匿名函数表达式,赋值给一个变量。如:var 变量=function(参数){函数体};
把一个匿名函数直接用括号括起来,然后直接调用。如:(function(){函数体})();
让函数对象作为一个返回值。如:return function(){函数体};
把函数表达式非匿名(),赋值给一个变量。如:var 变量=function 函数名(参数){函数体};
区别:函数声明会被前置。解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;至于函数表达式,则必须等到解析器执行到它所在代码行,才会真正被解释执行。
【作用域】
作用域就是函数跟变量可以访问的一个范围,其中有两个重要概念就是函数作用域跟块级作用域,但是在JS中,没有块级作用域。
块级作用域:在其他类C语言中,由{}封闭的代码块。如:if{}、for(){}。在其他类C语言中,if语句中的变量会在if语句执行完了之后被销毁,然而在JS中,if语句的变量声明会将变量添加到当前的执行环境中。
在JS中有全局作用域,函数作用域跟eval作用域。全局作用域一般声明在最外层,而函数作用域拥有自己的独立作用域,在函数之外是无法访问函数内部的变量。
当代码在一个环境中执行时,会创建变量对象的一个作用域链。作用域链是保证对执行环境有权访问的所有变量跟函数的有序访问。作用域链的前端,始终都是当前执行的代码所在环境的变量对象。作用域链中的下一个变量对象来自包含(外部)环境,而再下一个变量对象则来自下一个包含环境。一直延续到全局执行环境,全局执行环境的变量对象始终是作用域链中的最后一个对象。
在执行环境中,内部环境可以通过作用域链访问所有的外部环境,外部环境不能访问内部环境中的任何变量和函数,环境之间的联系是线性,有次序的。
执行环境总共有全局跟局部两种类型,但还可以通过其他方法延长作用域链。可以在作用域链前端临时增加一个变量对象,而该变量对象会在代码执行后被移除。如下:
try-catch语句的catch块:会创建一个新的变量对象,包含的是被抛出错误对象的声明。
with语句:会将指定的对象添加到作用域链中。
JavaScript(1)——变量、函数声明及作用域的更多相关文章
- 【JavaScript】Javascript中的函数声明和函数表达式
Javascript有很多有趣的用法,在Google Code Search里能找到不少,举一个例子: <script> ~function() { alert("hello, ...
- JavaScript之变量(声明、解析、作用域)
声明(创建) JavaScript 变量 在 JavaScript 中创建变量通常称为"声明"变量. 一.我们使用 var 关键词来声明变量: var carname; 变量声明之 ...
- Javascript高级程序设计——函数声明与函数表达式的区别
在Javascript中,函数是Functioin类型的实例,所以函数也具备属性和方法,因为函数是对象,所以函数名自然就是指向对象的指针啦. 函数可以通过声明语法和表达式来定义: 声明:functio ...
- javascript 中的函数声明和函数表达式区别
函数声明格式: function add(a, b) { alert(a+b); } 函数表达式格式: var add = function (a, b) { alert(a+b); } 解析器在向环 ...
- Javascript中变量函数申明优先级
先理解这句话: “函数会首先被提升,然后才是变量”,代码并不是你写的顺序那样执行的. F12把下面的代码粘贴到控制台执行一下: var getName = function () { console. ...
- php javascript C 变量环境 块级作用域
<?php $w = 'w'; $wb = '123'.$w; $w = 'ww'; echo $wb; if(TRUE){ $wd = '123wd'; } echo $wd; if(FALS ...
- 浅谈javascript函数,变量声明及作用域
javascript函数跟变量的声明.作用域这些概念网上都已经讲烂了. 这里写个博客,也相当于做个笔记. 变量声明 首先看个例子: var globalVar = "gv"; fu ...
- JavaScript 函数声明,函数表达式,匿名函数,立即执行函数之区别
函数声明:function fnName () {-};使用function关键字声明一个函数,再指定一个函数名,叫函数声明. 函数表达式 var fnName = function () {-};使 ...
- javascript立即执行函数
javascript和其他编程语言相比比较随意,所以javascript代码中充满各种奇葩的写法,有时雾里看花;当然,能理解各型各色的写法也是对javascript语言特性更进一步的深入理解. ( ...
随机推荐
- html readonly和disabled的区别
今天我创建了一个html表单,其中一个字段是sequence number, 这个字段是用ajax异步从后台获取自动生成的,我不希望用户修改这个值,于是我使用了如下html代码来处理: <for ...
- Chapter 16_4 私密性
在Lua面向对象编程的基础设计当中,没有提供私密性机制.但是可以用其他方法实现,从而获得对象的访问控制. 这种实现不常用,作为兴趣爱好,只做基本了解. 基本做法是:通过两个table来表示一个对象.一 ...
- 解决XCode插件在XCode6.4上失效的办法
Xcode 6.4 解决 插件失效的方法 查看 插件目录: ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/ 邮件打开插件 ...
- logrotate日志轮转配置文档
转自:http://blog.163.com/bull_linux/blog/static/2138811422013101334544349/ 使用: logrotate CONF_FILE+ ...
- 什么是JDBC?
JDBC是Java数据库连接(Java DataBase Connectivity)技术的简称,提供连接各种常用数据库的能力! 1.方式一(配置文件实现): <!-- 1. 连接池实例 --&g ...
- android 录制视频方式
http://www.cnblogs.com/skyseraph/archive/2012/03/31/2427593.html http://bbs.csdn.net/topics/39088448 ...
- 4. JavaScript 控制语句
1. If...Else 语句 1.1 条件语句if /* 格式: 1. if ... 2. if ... else ... 3. if ... else if .... else 4. switch ...
- wcf中的使用全双工通信
wcf中的契约通信默认是请求恢复的方式,当客户端发出请求后,一直到服务端回复时,才可以继续执行下面的代码. 除了使用请求应答方式的通信外,还可以使用全双工.下面给出例子: 1.添加一个wcf类库 2. ...
- C#用Zlib压缩或解压缩字节数组
/// <summary> /// 复制流 /// </summary> /// <param name="input">原始流</par ...
- 《JS权威指南学习总结--4.9.3in和instanceof运算符》
内容要点: 一.in运算符 in运算符希望它的左操作数是一个字符串或可以转换为字符串,希望它的右操作数是一个对象.如果右侧的对象拥有一个名为左操作数数值的属性名,那么表达式返回true. 例如: va ...