至于js的变量功用域和this指针的座谈_javascript技能_脚本之家

一、变量作用域:[P71]
这一句话说的非常精辟:“在ECMAScript中,只有两种执行环境,全局环境和函数环境,每个函数都是一个执行环境,包括嵌套函数。换句话说,其他情况下即使变量声明在一对大括号中,在括号外部仍然可以访问这些变量”。以下给出例子:
复制代码 代码如下: for { var num = 20; //
在for语句中声明的变量 } alert; //
在for语句外部调用变量,仍然可以得到num的值 对异常语句也同样可以: 复制代码 代码如下: try { var num = 20; //
在try语句中声明的变量 a = b; // 引起一个异常 } catch; //
在catch语句中调用变量,将得到20 } finally { alert; //
在finally语句中调用变量,将得到20 } alert; //
在try语句外部调用变量,将得到20
除了上面所演示的这两种语句外,一对大括号也无法构成一个执行环境,例如:
复制代码 代码如下: { var num = 1;3 }
二、this指针:[P83] 在这里列出this在ECMAScript中的不同含义:
在全局执行环境中使用this,表示Global对象,在浏览器中就是window对象。
当在函数执行环境中使用this时,情况就有些复杂了。如果函数没有明显的作为非window对象的属性,而只是定义了函数,不管这个函数是不是定义在另一个函数中,这个函数中的this仍然表示window对象。如果函数显示地作为一个非window对象的属性,那么函数中的this就代表这个对象。(当然可以使用apply或者call函数来取代默认this的引用,详见[P88])
当通过new运算符来调用函数时,函数被当做一个构造函数,this指向构造函数创建出来的对象。
参考: 《JavaScript基础与案例开发详解》清华大学出版社

在ECMAScript中,Function(函数)类型实际上是对象。每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数是对象,因此函数名实际上也是一个指向函数对象的指针。

 

 

 

1、三种函数声明的方式

 

 1》第一种:普通方式声明函数

 

1 function box (num1,num2){

2        return num1+num2;

3     }

 2》第二种:使用变量初始化的方式:

 

1 var box =function(num1,num2){

2        return num1+num2;

3     };

 

 

 3》第三种:使用Function构造函数的方式

 

1 var box =new Function(“num1”,’num2′,’return num1+num2′);

 

 

 

 

总结:第三种方式不推荐使用:因为要解析两次代码:第一次:解析常规的ECMAScript代码,第二次是解析传入构造函数中的字符串;所以影响性能。但是我们能从这种语法理解“函数是对象,函数名是指针”这个概念

 

 

 

2、作为值的函数

 

ECMAScript中的函数本身就是变量,所以函数也可以作为值来使用。也就是说,不仅可以传递参数一样把一个函数传递进另一个函数,而且也可以将一个函数作为另一个函数的结果返回。类似于
c# 中的 委托,令方法 像参数一样传递到另一个方法中。

 

复制代码

1 function box(sum,num){//将函数 以参数的 形式 传递进 另一个函数

2      return sum(num); //将函数作为返回值 进行返回

3     }

5 function sum(num){

6        return num+10;

7     }

8 alert(box(sum,10));//20

复制代码

 

 

 

 

3、函数内部的属性

 

在函数内部,有两个特殊的对象:arguments和this。arguments 是一个
类数组对象,包含着传入函数中的所有参数,主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

 

arguments属性的使用:

 

复制代码

1 function box(){

2        alert(arguments.length);

3        for(var i=0;i<arguments.length;i++){

4               alert(arguments[i]);  //取到每一个传进来的参数

5            }

6     }

8 box(1,2,3,4);

复制代码

 

 

callee属性(是arguments的属性)

 

复制代码

 1 //使用arguments.callee代替 自己

 2 function sum(num){

 3        if(num<=1){

 4              return 1;

 5            }

 6            else{

 7                   return num * arguments.callee(num-1);

www.hj8828.com, 8                }

 9     }

10 alert(sum(4));//24

复制代码

 

 

 this对象:

 

和c#中的this大致相似。this对象引用的是函数以执行操作的对象,或者说函数调用语句所处的那个作用域。

 

PS:当在全局作用域中调用函数时,this对象引用的就是window。

 

 

复制代码

1 var color=’红色’;

2 alert(window.color);//红色   只要是全局作用域内的对象 就是 window下

3 alert(this.color)//红色  
 this位于全局作用域下,this引用的就是window对象

4 alert(color);//红色   可以省略 window直接输出

6 window.color=’蓝色’;   //等价于:var color=’蓝色’;

7 alert(this.color);//蓝色

8 alert(color);//蓝色

复制代码

 

 

 

 

this对象的经典的例子: