作用域与命名空间

作用域

无论如何,函数是唯一拥有自身作用域的结构,其它任何形式的结构都不支持作用域。代码如下所示

var demo = function ()
{
	...
};

function demo ()
{
	...
};

JavaScript语言中没有显式的命名空间定义,意味着所有对象都定义在一个全局共享的命名空间下

引用变量时,向上依次遍历当前作用域与全局作用域,直到发现这个变量

隐式全局变量与局部变量

在函数的自身作用域内,如果变量声明不使用var表达式,函数运行就会导致隐式全局变量产生。先看如下代码所示

var demo = function ()
{
	number = 1;
};
demo();

var demo = function ()
{
	for (number = 0; number < 5; number ++)
	{
		...
	};
};
demo();

运行结果都为声明了一个全局变量number;如不想声明或者覆盖一个全局作用域内的同名变量,就必须使用var表达式。代码如下所示

var demo = function ()
{
	var number = 1;
};
demo();

var demo = function ()
{
	for (var number = 0; number < 5; number ++)
	{
		...
	};
};
demo();

运行结果都为声明了一个仅在当前作用域内才有效的局部变量number

变量声明提升(Hoisting)

变量声明在JavaScript语言中会被提升,意味着var表达式、function声明会被提升至当前作用域顶部。先看如下代码所示

demo();
var demo = function ()
{
	...
};

demo();
function demo ()
{
	...
};

代码执行之前被转化为

var demo;
demo();
demo = function ()
{
	...
};

function demo ()
{
	...
};
demo();

运行结果为第一段代码执行失败,第二段代码执行成功;因为第一段代码执行时demo仅仅是声明了,但是依然缺省值为undefined

非常有意思的是局部变量声明的提升。再看如下代码所示

var number = 0;
var demo = function ()
{
	if (true)
	{
		number = 1;
	}
	else
	{
		var number = 2;
	};
	console.log(number);
};
demo();
console.log(number);

代码执行之前被转化为

var number, demo;
number = 0;
demo = function ()
{
	var number;
	if (true)
	{
		number = 1;
	}
	else
	{
		number = 2;
	};
	console.log(number);
};
demo();
console.log(number);

输出结果为1、0;本该覆盖全局变量number的代码转化为声明了一个局部变量number,如想覆盖全局变量number,就必须取消使用var表达式。代码如下所示

var number = 0;
var demo = function ()
{
	if (true)
	{
		number = 1;
	}
	else
	{
		number = 2;
	};
	console.log(number);
};
demo();
console.log(number);

输出结果为1、1

命名空间

只有一个全局作用域会导致命名冲突,解决方案是匿名包装器,作用是通过该函数创建一个新的命名空间。先看如下代码所示

(function (){
	...
})();

由于匿名函数被认为是表达式,为了可调用性,需要先行执行,我们可以把自执行的匿名函数理解为匿名包装器。再看如下代码所示

( //小括号内函数先行执行
function() {
	...
}
) //返回函数对象
(); //立即执行匿名函数,并调用以上执行结果即函数对象

通过匿名包装器创建命名空间,不仅可以防止命名冲突,而且有利于程序的模块化

还有一些其他的函数表达式调用方法。代码如下所示

+function(){
	...
}();
(function(){
	...
}());
时间: 2025-01-31 00:36:32

作用域与命名空间的相关文章

Python3.2官方文档翻译--作用域和命名空间实例

6.2.1 作用域和命名空间实例 以下的实例主要用来示范怎样引用不同的作用域和命名空间,keywordglobal和nonlocalru怎样影响变量绑定. 实例执行结果是: After local assignment: test spam After nonlocal assignment: nonlocal spam After global assignment: nonlocal spam In global scope: global spam 注意局部赋值(这是默认的)不能改变sco

Python3.2官方文档翻译--作用域和命名空间

6.2 Python作用域和命名空间 在介绍类之前,首先我想告诉你一些关于python作用域的规则.类的定义非常巧妙地运用了命名空间,你需要知道范围和命名空间的工作原理以能全面了解接下来发生的. 顺便说一下,关于这节讲到的知识对于任何优秀的python程序员非常有用. 让我们开始以一些定义开始. 命名空间(namespace)是一个从名称到对象的映射.大多命名空间目前用Python字典实现的,但那通常不会被注意(除非为了性能),在将来它可以改变.命名空间的例子是:内置名称的set(包含函数如ab

详解Python的作用域和命名空间

最近在学习Python,不得不说,Python真的是一门很好用的语言.但是学习的过程中关于变量作用域(scope)的命名空间(namespace)的问题真的把我给搞懵了.在查阅了相关资料之后,觉得自己对Python的作用域和命名空间有了一定得了解.故写在这里,一方面加深自己的理解,另一方面分享知识. 一.本篇博客需要解决的问题. 1.什么是作用域和命名空间? 2.Python中作用域和命名空间的工作原理是什么? 3.我怎样在Python中声明一个全局变量(global variable),局部变

Python 作用域和命名空间

Python Scopes and Namespaces A namespace is a mapping from names to objects. 命名空间是一个从名字到对象的映射(指向,明确的路径). Most namespaces are currently implemented as Python dictionaries. 大部分都是由字典dict(其他语言也称为hash)实现. 例子: the set of built-in names .放置内置函数的集合.模块中的全局名称:

【转】C语言中标识符的作用域、命名空间、链接属性、生命周期、存储类型

Technorati 标签: C,标识符,作用域,命名空间,链接属性,生命周期,存储类型,scope,name space,linkage,storage durations,lifetime 无论学习哪一种语言,都免不了要讨论这些问题.而且这些问题,深究起来有时也让我们很迷惑. 标识符的定义无需多讲,只需注意不仅仅是指变量,还有函数,标签等. 1. 标识符的作用域 作用域是指允许对标识符进行访问的位置范围.按照C99(章节6.2.1),C语言的作用域共有 4 种类型:文件作用域.代码块作用域.

C++学习笔记(九):作用域和命名空间

作用域 作用域规则告诉我们一个变量的有效范围,它在哪儿创建,在哪儿销毁(也就是说超出了作用域).变量的有效作用域从它的定义点开始,到和定义变量之前最邻近的开括号配对的第一个闭括号.也就是说,作用域由变量所在的最近一对括号确定. (1) 全局变量: 全局变量是在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用.全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束).如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这

python函数的动态传参.作用域与命名空间

一.动态传参1.*表示动态传参. 可以接受所有的位置参数传参的时候自动的把实参打包成元组 交给形参 def chi(*food): print(food) chi() # 动态传参可以不传参数 chi(good_food = "胡辣汤") # 关键字传参 chi("胡辣汤", "疙瘩汤", "西红柿鸡蛋汤") chi("大猪蹄子","大汉堡","薯条","圣

函数的 命名空间 作用域

================================ 函数进阶 ================================ --------- 全局的命名空间 ---- 函数外部的1 命名空间--------- 局部命名空间 ---- 函数内的 内置的命名空间----- python 内置的 调用时 命名空间的 加载顺序 python启动 ===>> 内置的命名空间 ====>> 加载全局命名空间(从上到下) ===>>> 加载局部的命名空间(从

嵌入式 Linux C语言(八)——存储类型、作用域、生命周期、链接属性

嵌入式 Linux C语言(八)--存储类型.作用域.生命周期.链接属性 一.存储类型 C语言中,每个变量和函数都有两个属性:数据类型和数据的存储类型. 变量的存储类型是指存储变量值的内存类型.变量的存储类型决定变量何时创建.何时销毁以及它的值将保持多久.计算机中有三个地方可以用于存储变量:普通内存,运行时堆和栈,硬件寄存器.变量的存储类型取决于声明变量的位置. C语言存储类别说明符: 说明符 用    法 auto 只在代码块内变量声明中被允许, 表示变量具有本地生存期 extern 出现在顶