一、js作用域,先上图:

JS作用域和ASP(vbs)作用域比较-LMLPHP

以上代码执行的效果是,依次弹出 undefined, undefined, a, a,为什么是这样的结果啦?因为JS的作用域为链式作用域.

作用域链:

用VAR声明一个变量时,就为该变量所在的对象添加了一个属性,由于JS的变量都是对象的属性,而该对象可能又是其它对象的属性,而所有的对象都是WINDOWS属性,所以这些对象的关系可以看作一条链,链头就是变量的所处对象,链尾就是WINDOWS对象。

我们来分析一下上面函数中变量的作用域链。第一个alert输出的str,它的作用域链是str-自运行函数(+function)-windows,当执行自运行函数(+function)时,将创建函数的执行环境,并对该str置于链头,所以此str为自运行函数内的,但alert时,并没有为其赋值,所以此时输出str为undefined

第二个alert输出的str,它的作用域链是str-f2-自运行函数(+function)-windows,输出undefined原因同上。

第三个alert输出的str,它的作用域链是str-windows,所以输出a

第四个alert输出的str,它的作用域链同第三个。

理解了上面,我们来总结一下JS的作用域:

1、 JS没有var的变量都为全局变量,且为windows对象的属性(这个李源老师讲过了,我不再证明)

2、 函数内(函数内的函数除外)定义的变量在整个函数内部有效。

3、 函数内的变量取代全局同名变量。

4 、没块的使用域。(这个李源老师讲过了,我不再证明)

二、asp的使用域,同样先上图

JS作用域和ASP(vbs)作用域比较-LMLPHP

以上代码输入字符串: 1 a 2 b 3

通过以上代码我们得出:

1、 函数中定义的变量的作用域是整个函数,不管变量在函数中那个位置定义。

2、 函数中同名的变量会取代全局变量。

3、 隐式声明的变量的作用域取决于其声明的位置,如果在函数中,则些变量只在函数中有效,如果在函数外,则整个页面有效。

4、 没有块级作用域。

VB中定义变量的作用域有Public/Private/Static、Dim,但在ASP中,并没有static。

在ASP中,我将作用域划分为页面级,类级,函数级,页面级和函数级用dim,类级用public/private

04-26 23:56