做用域与命名空间

做用域

不管如何,函数是惟一拥有自身做用域的结构,其它任何形式的结构都不支持做用域。代码以下所示javascript

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

java

function demo ()
{
	...
};

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

引用变量时,向上依次遍历当前做用域、全局做用域,直到发现该变量函数

 

隐式全局变量与局部变量

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

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

blog

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

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

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

作用域

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

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

 

变量声明提高(Hoisting)

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

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);

输出结果为一、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

 

命名空间

只有一个全局做用域会致使命名冲突,解决方案是匿名包装器,做用是经过匿名函数建立一个新的命名空间。先看以下代码所示

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

因为匿名函数被认为是表达式,为了可调用性,须要先行执行,咱们能够把自执行的匿名函数理解为匿名包装器。再看以下代码所示

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

经过匿名包装器建立命名空间,不只能够防止命名冲突,并且有利于程序的模块化

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

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

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

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

 

有意思的思考题

var number = 0;
(function (){
	console.log(number); //猜猜输出是什么
	var number = 1;
})();
相关文章
相关标签/搜索