javascript模仿块级作用域(第一篇)
作用域有词法作用域和块级作用域之分,javascript属于词法作用域,而在java、C++中却是块级作用域。在javascript中,只有函数能够创建作用域,作用域是以function作为边界的。
先看一段代码:
function outPut(){
for(i=0;i<5;i++) {
console.log(i);//0,1,2,3,4 第一个i
}
console.log(i);//5 第二个i
};
解释:在java等语言中,for循环这块代码中的i变量将会被销毁,第二个i打印出来就是undefined了,因为它们是块级作用域。如果需要使第二个i无法访问第一个i,就需要模仿块级作用域!
刚刚我说过,在javascript中,只有函数能够创建作用域,所以块级作用域需用函数去创建。通常的做法是通过匿名函数去实现,如下:
(function(){
//这里是块级作用域
})();
解释:javascript模仿块级作用域其实非常简单!但是对于一些基础较差的同学可能还是不能很好的理解,我们把它拆开来看。
var fn=function(){
//省略一段代码
};
fn();
这是一段非常普通的函数定义和调用的代码。在javascript中,函数是一等对象,所以可以把函数当成值或参数进行传递(题外话:当把函数当成参数放在另外一个函数当中时,就可以实现回调函数),在这里是将匿名函数赋值给变量fn,然后用一个括号()执行函数fn。
从上面可能我们会想到:直接用匿名函数function(){...}替换fn来执行不就可以了吗?所以就有了下面的代码:
function(){
... //Uncaught SyntaxError
}();
然而这是错误的写法。因为匿名函数仅仅是一个函数声明,函数声明不能够进行函数执行,如果要让它执行怎么办?我们可以通过一些手段让函数声明转变为函数表达式,从而使函数能够执行下去,常见的写法也就是用()括号把匿名函数进行包裹()!
这种javascript写法其实还有另外一种更加准确的叫法:立即调用的函数表达式(IIFE)。顾名思义:它是一个函数表达式,可以立即执行!下一篇博客我将会更加深入地讲解它。
javascript模仿块级作用域(第一篇)的更多相关文章
- JavaScript模仿块级作用域
avaScript 没有块级作用域的概念.这意味着在块语句中定义的变量,实际上是在包含函数中而非语句中创建的,来看下面的例子: function outputNumbers(count){ for ( ...
- JavaScript函数表达式、闭包、模仿块级作用域、私有变量
函数表达式是一种非常有用的技术,使用函数表达式可以无需对函数命名,从而实现动态编程.匿名函数,是一种强大的方式,一下总结了函数表达式的特点: 1.函数表达式不同于函数声明,函数声明要求有名字,但函数表 ...
- JavaScript之模仿块级作用域
简介:在JavaScript中没有块级作用域的概念.这意味这在块语句中定义的变量,实际上在包含函数中而非语句中创建的.证明代码如下: function outputNumbers(count){ fo ...
- JavaScript 作用域 匿名函数 模仿块级作用域(私有作用域)
作用域 对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的. 而javascript没有块级作用域,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境( ...
- JavaScript IIEF 模仿块级作用域
前言 JavaScript没有块级作用域的概念.但是通过IIEF 立即执行函数我们可以实现块级作用域. function outputNumbers(count){ for (var i=0; i & ...
- Javascript高级编程学习笔记(25)—— 函数表达式(3)模仿块级作用域
昨天写了闭包 今天就来聊聊块级作用域的事情 在绝大多数编程语言中,都有块级作用域这个概念 什么是块级作用域呢? 前面我们在刚开始讲的时候说过,JS中的大括号(不在赋值运算符的后面)表示代码块 块级作用 ...
- javascirpt怎样模仿块级作用域(js高程笔记)
因为javascript没有块级作用域的概念,所以在块语句中定义的变量,实际上是在包括函数中而非语句中创建的. 如: function outputNumbers(count){ for(var i= ...
- Javascript的块级作用域
一.块级作用域的说明 在学习JavaScript的变量作用域之前,我们应当明确几点: a.JavaScript的变量作用域是基于其特有的作用域链的. b.JavaScript没有块级作用域. c. ...
- JS 模仿块级作用域
function outputNumbers(count) { for (var i=0; i<count; i++) { console.log(i); } var i; // 重新声明变量 ...
随机推荐
- (大数据工程师学习路径)第一步 Linux 基础入门----Linux 下软件安装
介绍 介绍 Ubuntu 下软件安装的几种方式,及 apt,dpkg 工具的使用. 一.Linux 上的软件安装 通常 Linux 上的软件安装主要有三种方式: 在线安装 从磁盘安装deb软件包 从二 ...
- windows server 2008见安装IIS方法(解决)
windows server 2008见安装IIS方法(解决) 刚开始有点蒙,后来才知道原来如此.! . 右键点击[我的电脑]--[管理]--[字符]--[加入角色]--仅落后win7像.啊! 版权声 ...
- activiti入门2流程引擎API和服务基础设施
RepositoryService : 管理和控制公布包和流程定义(包括了一个流程每一个环节的结构和行为)的操作 除此之外,服务能够 查询引擎中的公布包和流程定义. 暂停或激活公布包.相应所有和特定流 ...
- strncpy和strcpy
实体化代码运行图: 实现代码: #include <stdio.h> #include <string.h> #include <math.h> #include ...
- oracle_有关表分区_查询
<!--查询ORACLE分区表存在多少个分区--> SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TBL_PAGE'; < ...
- hdu1286 寻找新朋友 (欧拉功能)
原标题:点击打开链接 关于欧拉函数的算法具体解说:点击打开链接 欧拉函数 1.欧拉函数是不全然积性函数. 2.欧拉函数p(x) = x * (p1 - 1) / p1 * (p2 - 1)/p2 * ...
- Jquery()核心函数的7个重载方法
(1) jquery() 该函数返回一个空的jQuery对象.在jQuery1.4以后的版本中,改函数返回一个空的jQuery对象.在之后的版本中,该函数会返回一个包含document节点的对象. ( ...
- MSSQL发现第五到数据的第十
第二十数据查询数据库,第十条数据,两起案件: 1,ID是连接的,当然这样的情况比較好查.直接SELECT就能够了.取ID大于5小于10就能够了, 这样的情况比較少. 2.ID不是连接的.假设要取第五条 ...
- 赵雅智_Android编码规范
凝视 导入mycodetemplates.xml统一凝视样式 须要加凝视的地方 类凝视(必加) 方法凝视(必加) 块凝视主要是数据结构和算法的描写叙述(必加) 类成员变量和常量凝视(选择性加入) 单行 ...
- MVC 发布到 windows2003遇到 'System.Web.WebPages.Razor 错误提示
摘自: http://blog.csdn.net/lanqiao825/article/details/7840606 http://bbs.maticsoft.com/forum.php?mod=v ...