注:《JavaScript核心概念》适合深入了解JavaScript,比我买的《JavaScript框架设计》语言和内容丰富多了(可能是我水平尚浅吧)。

1. 作用域

var herp=”one”;
{
var herp=”two”;
}
alert(herp); //two,

上面这个很简单,那看看下面这两个。

//代码1
var str="global";
function scopteTest(){
alert(str); //
str="local";
alert(str); //
}

这里1和2会输出什么呢?

//代码2
var str="global";
function scopteTest(){
alert(str); //3
var str="local";
alert(str); //4
}

这里3和4又会输出什么呢?

答案:1、2、3、4分别输出

global
local
undefined
local

很神奇吧,尤其是第三个,详情去看《JavaScript核心概念》吧。

大致原理:JavaScript的作用域是词法作用域。在代码2中,词法分析结束后,str变量 已经加入到 scopteTest函数局部作用域了,即整个函数内部已经知道自己内部有个 str,当然就不再去访问 外部的 str了。但由于 //3 处于 变量的 定义 之前,所以 会输出 undefined。

2. 经典的闭包例子

//例子1
var outter=[];
function closureTest(){
var array=["one","two","three","four"];
for(var i=0; i<array.length; i++){
var x={};
x.no = i;
x.text = array[i];
x.invoke = function( i ){
print(i);
};
outter.push(x); }
} closureTest();
print(outter[0].invoke());
print(outter[1].invoke());
print(outter[2].invoke());
print(outter[3].invoke());
//例子2
var outter=[];
function closureTest(){
var array=["one","two","three","four"];
for(var i=0; i<array.length; i++){
var x={};
x.no = i;
x.text = array[i];
x.invoke = function( no ){
return function(){
print(no);
}
}(i);
outter.push(x); }
} closureTest();
print(outter[0].invoke());
print(outter[1].invoke());
print(outter[2].invoke());
print(outter[3].invoke());

例子1输出:

4
4
4
4

例子2输出:

0
1
2
3

3. JavaScript函数的创建

创建JavaScript函数的一种不长用的方式(几乎没有人用)是通过new操作符来作用于Function“构造器”:

var funcName = new Function( [argname1, [... argnameN,]] body );  

参数列表中可以有任意多的参数,然后紧跟着是函数体,比如:

var add = new Function("x", "y", "return(x+y)"); print(add(2, 4));

但更常用的是通过字面量来创建函数:

function add(x, y){  return x + y; }

4. new 一个函数的实质过程

在JavaScript中,通过 new 操作符,来作用一个函数,实质过程是这样的:

  首先,创建一个空对象,然后用函数的 apply 方法,将这个空对象传入作为 apply 的第一个参数,及上下文参数。这样函数内部的this将会被这个空对象所替代。

  例如:

var triangle = new Shape("triangle");
//相当于下面:
var triangle = {};
Shape.apply(triangle, ["triangle"]);
05-01 07:52