《JavaScript核心概念》基础部分重点摘录
注:《JavaScript核心概念》适合深入了解JavaScript,比我买的《JavaScript框架设计》语言和内容丰富多了(可能是我水平尚浅吧)。
1. 作用域
var herp=”one”; { var herp=”two”; } alert(herp); //two,
上面这个很简单,那看看下面这两个。
//代码1
var str="global"; function scopteTest(){ alert(str); //1 str="local"; alert(str); //2 }
这里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"]);