javascript教程-变量与作用域
星期一, 四月 27th, 2009, 18:17 | YSjia 点击2006次自己也已经写了好久javascript但是觉得很混乱,所以将自己熟悉的一些东西用教程的方式记录下来。一方面可以加深记忆,另一方面可以与大家分享,共同勉励。
1. 变量
javascript采用的是一种匿名声明的方法。即不需要事先声明变量,可以程序里即使即用。如:
i=1;j=2; alert(i+j);
结果alert出3。
这种使用方法很灵活,但是也很危险。因为匿名声明的所有变量都会是全局变量。这样你的所有javasciprt片段或文档都可以引用这一变量。
同时你可以用var关键字来进行变量声明这样所声明的变量会作为局部变量,与全局变量不同的是局部变量在于不同的作用域。
1.2 变量的作用域
JavaScript中的函数是基于静态作用域(也叫词法lexical作用域),而不是动态作用域。这句话的意思是JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里。在一个静态作用域里,变量永远指向它的最顶层作用域。这是程序文本(program text)的一个属性并且与运行时调用的堆栈无关。因为匹配变量的作用域仅仅只需要分析程序文本即可,这样的作用域我们叫作静态作用域(lexical scoping)
e.g.1
function f1() {
var a = 20;
return function () { alert(a); }
}
var b = f1();
b();
结果:20
e.g.2
function f1() {
var a = 20;
return f2
}
function f2() {
alert(a);
}
var b = f1();
b();
结果:undefined
在程序1里一个匿名函数b()被声明时,变量a已经被保存在作用域里。所以得到20.但是在程序2里在函数f2()里,没有声明变量a所以没有任何值。
一但函数被定义,它会“记住”它的作用域与作用域链。这也并不是意味着函数里的所有变量都是这样。正好相反,你可以任意的添加、修改和删除。函数里都会保存最新的变量。但是必须知道变量是什么时候被定义而并不是这个作用域里它什么时候包含的。
静态作用域的几个特点
- 在程序里特殊地方定义的变量永远指向具有相同定义的变量,即程序每次执行时被执行函数所在的作用域里相同定义的变量
- 变量是可以通过静态检查(static examination)源码中的作用域里出现的标识符(var)来将其值(value)改变的,而不是把整个函数做为一个整体来执行。
其实总结起来就是javascript特有的链式作用域,这样的链式特点在javascrit里非常重要。jQuery与prototype就是最好的应用javascript链式反应例子。
看代码:
var x='aaa';
function f(){
var x='bbb';
function g(){alert(x);}
g();
}
f();
结果是:bbb
在这段代码里,里层的g()在执行时会先检查g()内是否有变量x然后如果没有再检查f()函数内是否有x定义,正好在f()内发现在了x这样的话就将x传入g()内,然后alert出来。
这个其实就是一个最简单的闭包。
如果你喜欢请+1
Tags: javascript
“在程序里特殊地方定义的变量永远指向具有相同定义的变量,即程序每次执行时被执行函数所在的作用域里相同定义的变量”这句话理解起来挺困难的
[回复]
话比较绕口,看后面的例子,就是解释。也可看《javascript权威指南》,里面写的非常详细,是一本非常好的书。
[回复]