JS高级程序设计中对“私有作用域”的经典解释

JavaScript从来不会告诉你是否多次声明了同一个变量;遇到这种情况,它只会对后续的声明视而不 见(不过,它会执行后续声明中的变量初始化)。

匿名函数可以用来模仿块级作用域并避免这个问题。 用作块级作用域(通常称为私有作用域)的匿名函数的语法如下所示。

(function(){ //这里是块级作用域
})();

以上代码定义并立即调用了一个匿名函数。

将函数声明包含在一对圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号会立即调用这个函数。

如果有读者感觉这种语法不太好理解, 可以再看看下面这个例子。

var count = 5;
outputNumbers(count);

这里初始化了变量 count,将其值设置为 5。当然,这里的变量是没有必要的,因为可以把值直接传给函数。

为了让代码更简洁,我们在调用函数时用 5来代替变量 count,如下所示。

outputNumbers(5);

这样做之所以可行,是因为变量只不过是值的另一种表现形式,因此用实际的值替换变量没有问题。 再看下面的例子。

var someFunction = function(){
//这里是块级作用域
};someFunction(); 

这个例子先定义了一个函数,然后立即调用了它。定义函数的方式是创建一个匿名函数,并把匿名函数赋值给变量 someFunction。

而调用函数的方式是在函数名称后面添加一对圆括号,即 someFunction()。通过前面的例子我们知道,可以使用实际的值来取代变量 count,那在这里是不是也可以用函数的值直接取代函数名呢?

然而,下面的代码却会导致错误。

function(){
//这里是块级作用域 //出错!
}();

这段代码会导致语法错误,是因为 JavaScript将 function 关键字当作一个函数声明的开始,而函数声明后面不能跟圆括号。

然而,函数表达式的后面可以跟圆括号。要将函数声明转换成函数表达式, 只要像下面这样给它加上一对圆括号即可。

(function(){
//这里是块级作用域
})();

原文地址:https://www.cnblogs.com/xiaozhaoqi/p/8413126.html

时间: 2024-10-11 21:54:47

JS高级程序设计中对“私有作用域”的经典解释的相关文章

[js]js栈内存的全局/私有作用域,代码预解释

js代码如何执行的 浏览器提供执行环境: 全局作用域(提供js执行环境, 栈内存) --> 执行js需要预解释 - 带var : 提前声明 - 带function关键字的: 提前声明+定义 js中的栈内存(对应全局/私有作用域)和堆内存 <script> // 基本: num str boollen null undefied // 引用: [] {} \^$\ Date var num = 12; var obj = {name: "maotai", age: 22

&lt;JS高级程序设计3&gt;_PART4

1.基本数据类型:Undefined,null,Number,String,Boolean.引用数据类型:保存在内存中的对象. 2.JS不允许直接访问内存中的位置,不能直接操作对象的内存空间.所以操作对象时,实际上是操作的对象的引用,而不是实际的对象. 3. var num1 = 1; var num2 = num1; 一个基本类型的变量向另一个赋值时,执行了复制操作,两个变量互不影响. var obj1 = new Object(); var obj2 = obj1; obj1.age = 2

&lt;JS高级程序设计3&gt;_PART3

1.ECMAScript中所有数都以IEEE-754 64位格式存储,但位操作符不直接操作64位的值.是先64位转换成32位的整数,再操作,得到结果再转成64位. 2.首位是符号位.之后的31位代表整数的值. 3.用toString(2)打印二进制,得到的是被处理过的二进制. 4.按位非(NOT)~,数转成二进制,取反.相当于把操作数先变负再-1; 5.按位与(AND)&,两个数的二进制,有一个0结果就是0,两个都是1才为1. 6.按位或(OR)|,有一个1结果为1,都是0才为0. 7.按位异或

读书笔记 - js高级程序设计 - 第十五章 使用Canvas绘图

读书笔记 - js高级程序设计 - 第十三章 事件 canvas 具备绘图能力的2D上下文 及文本API 很多浏览器对WebGL的3D上下文支持还不够好 有时候即使浏览器支持,操作系统如果缺缺乏必要的绘图驱动程序,则浏览器即使支持了也没用   <canvas> var drawing = document.getElementById("drawing"); if( drawing.getContext ){ drawing.getContext("2d"

js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定

js高级程序设计笔记之-addEventListener()与removeEventListener(),事件解除与绑定 addEventListener()与removeEventListener()用于处理指定和删除事件处理程序操作.所有的DOM节点中都包含这两种方法,并且它们都接受3个参数:要处理的事件名.作为事件处理程序的函数和一个布尔值.最有这个布尔值参数是true,表示在捕获阶段调用事件处理程序:如果是false,表示在冒泡阶段调用事件处理程序. 要在按钮上为click事件添加事件处

JS高级程序设计拾遗

<JavaScript高级程序设计(第三版)>反反复复看了好多遍了,这次复习作为2017年上半年的最后一次,将所有模糊的.记不清的地方记录下来,方便以后巩固. 0. <script>元素属性 async表示立即下载脚步,但不应该妨碍页面中其他操作: defer表示延迟到文档完全被解析和显示之后再执行.这两个属性都仅适用于外部脚步,而且现实中脚步不一定按顺序执行.指定async属性的目的是不让页面等待脚步下载和执行. 最好只包含一个延迟脚本,把延迟脚本放在页面最底部仍然是最佳选择.

js高级程序设计(第三版)学习笔记(第一版)

ecma:欧洲计算机制造商协会iso/iec:国际标准化和国际电工委员会 dom级别(10*)文档对象模型1:DOM核心(映射基于xml文档)与dom html(在dom核心基础上)2:对鼠标,事件,范围,遍历,还有对css样式表的支持dom2:新接口...视图,事件(鼠标,移动),样式(css),遍历与范围(对文档树的操作)3:对文档加载和保存,验证模块,对核心进行扩展,对xml.0规范其他domsvg可伸缩矢量图mathml数学标记语言mghi同步多媒体集成语言ie5 dom1mozilla

js高级程序设计第三版---1~3章

DOM并不只是会对js的,很多其它语言也实现了DOM,但DOM已经是js的一个重要组成部分. BOM是js实现的一部分,但是没有相关的标准,所以每个浏览器都有自己的实现,这个问题在HTML5中得到了解决. 1.<script>的属性: async(异步加载):表示立即下载脚本,不会影响页面中的其它操作,只对外部脚本有效.<script async="async" type="text/javascript"</script> chars

js高级程序设计(四)变量、作用域和内存问题

基本类型和引用类型的值 ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值.基本类型值指的是 Undefined . Null . Boolean . Number 和 String,而引用类型值指那些可能由多个值构成的对象.基本数据类型是按值访问的,引用类型的值是按引用访问的. 动态的属性 对于引用类型的值,我们可以为其添加属性和方法,也可以改变和删除其属性和方法. var person = new Object(); person.name = "Nicholas