这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 Javascript 链式作用域详细介绍的相关资料, 需要的朋友可以参考下
Javascript 链式作用域
其实对于 Javascript 链式作用域的描述,包括,JS 权威指南,都有些太冗长了 -- 但是很准确:JavaScript 中的函数运行在他们被定义的作用域里,而不是他们被执行的作用域里。
这句话有点难懂,但程序的设计,基本都是为了简单,便于理解的。记住 JS 中经典的一句话是,一切皆对象。
说白了链式作用域,其实就是 Javascript 的一个特性:子函数中可以访问父函数的所有变量。当然也包括全局变量 window(一般的函数定义 function a(){},其实都是 window 对象的子函数)。另外补充一下,函数定义有两种方式,其实略有差别:
- var a = function() {}和
- function a() {},
稍后再解释他们的区别。
所以,我们看 Crockford 的 <
我们看一下 laruence 提供的例子:
- var name = 'laruence';
- functionecho(){
- alert(name);
- var name = 'eve';
- alert(name);
- alert(age);
- }
- echo();
这个例子其实很有迷惑性(会让人错误的以为,输出结果是:laruence,eve,error;其实结果是:undefined,eve,error),关键就是因为 echo() 函数中定义的 var name='eve'。但其实换个写法,这个例子就很清楚了:
- var name = 'laruence';
- function echo() {
- var name;
- alert(name);
- name = 'eve';
- alert(name);
- alert(age);
- }
- echo();
其实,上面的函数在 JS 引擎解析的时候,就会被解析成这样。如果你是初学者,其实这样理解就可以了。但如果你有别的程序的编程经验,例如 java。就很容易被惯用思维给套住了,PS:本人就是给套住的一个。所以,还是按照 Crockford 的建议把,定义变量,请在函数顶部!!
还记得之前的问题吗?
var a=function(){} 和 function a(){} 的区别。
它们的区别还变量的定义比较类似。一切皆对象。
他们两个在函数调用时,基本是等价的,但如果调用函数,在定义函数前就会有问题了。其实区别在于等号和 function 关键字。 var 和 function 定义在预编译的时候被提前,var 只是占位,具体赋值要等到 JS 引擎执行到这行。而 function 定义会在 JS 引擎预编译阶段就被直接放入到调用对象中。
还是要举例:
例子一:
- alert(echo); //function echo(){return 1;};
- function echo() {
- return 1;
- };
- alert(a); //undefined
- var a = function() {
- return 1;
- };
所以,函数的定义也可以引申出一句话,请将函数定义放在顶部(先定义后调用)!!
其实还是习惯的问题,JS 中一些代码的优良习惯有别于其它语言。建议大家读一下 <
另外说一点,this 关键字,laruence 的解释很简洁到位:"谁调用,谁就是 this"。英文版更详细一点:"In JavaScript this always refers to the"owner"of the function we're executing, or rather, to the object that a function is a method of. ",中文解释:" 在 JavaScript 中,this 永远引用我们所执行函数的拥有者,更准确的说,this 引用一个函数的方法对象 "。
看看下面的例子,也是误导人的:
- function a(){
- g_value="uk";
- }
- a();
- alert(g_value);
其实,比较友好的写法应该是这样:
- function a(){
- this.g_value="uk";
- }
- a();//a.apply(this);
- alert(this.g_value);
关于 this 关键字,和别的语言也有区别。首先它并不是实例的引用,而是调用它的上下文。上面例子的 a(),等价于 a.apply(this);
call 和 apply 的用法是一样的,区别就在参数传递上。一个是一个一个传参数的,一个是将参数作为类数组传递的(注意这个地方是类数组)。
来源: http://www.phperz.com/article/17/0514/327333.html