第四章主要讲的是Function.
function有四种调用的pattern,重点是要注意这4种pattern下,function中的this分别指什么。
1.the method invocation pattern
function被作为某个对象的property时,我们把这个function叫做method,当在那个对象上调用这个method时,function内部的this就是指的这个对象,例子如下:
var myObject = {
value: 1,
increment: function(inc){
this.value += (typeof inc == 'number' ? inc : 1);
return this;
}
};
alert(myObject.increment(3).value);//4
2.the function invocation pattern
这个就是普通的函数,这时候函数里的this是指global object,浏览器里就是window,这个是javascript设计时候的一个错误,如果是按原来正确的设计,函数中的this应该是被绑定到外层函数的this上,可能你有点不理解我说的意思了,呵呵,那就举个例子吧,如果在script中直接定义一个函数,
function outer(){//code goes here}
, 那么,两种情况下都是一样的,因为outer的外层没有了,就是window。但是如果是这样:
myObject.double = function(){
var helper = function(){
this.value = 2 * this.value;
}
helper();
}
我的本意是想让内部的函数来帮我做点事,在double中,this是绑定到myObject上的,但是helper里面的this之绑定到window的,怎么办呢?
其实也很简单,把double赋给另一个变量,然后传进去,如下
myObject.double = function(){
var that = this;
var helper = function(){
that.value = 2 * that.value;
}
helper();
}
3.the constructor invocation pattern
这个也是经常用的,用new去调用一个函数的时候,其实是新创建了一个对象,给它赋一个隐藏的指向构造函数的prototype对象的reference(呵呵,这个有点难表达,不清楚就去看看犀牛书吧),然后把它当作this,去执行这个函数,最后返回这个对象。这个函数一般叫构造函数,构造函数一般把首字母大写,以区别与普通的function。
如下:
function Person(name, age){
this.name = name;
this.age = age;
}
但是这种方式有一个问题,构造函数是用来用 new Person();这种方式来调用的,但是如果你不小心没有new, 直接去调用了Person方法,那么,name和age就变成了window的属性了,毕竟这两个名字还好,但是如果取的名字和window原来的属性同名了,或者你原来在window上设置了一些全局变量,那么这种bug将是非常难找出来的。
4.the apply invocation pattern
这个也是很简单的一个调用方式,形式如下:
var obj = {value: 3};
var arg = [3];
myObject.increment.apply(obj,arg);
呵呵,看的各位不太好意思了,感觉自己的表达能力太差了,写的自己都有点不太明了。
最后些点自己的理解吧,学javascript也有比较长的时间了,感觉最近基本开始习惯javascript了,我觉得javascript中最重要的是要理解它是基于原型的,弱类型的,
基于原型:classic 的oo都是class-based的,但是javascript是prototype-based的,它更expressive,更灵活,因此如果不深入理解,也比较容易出错。
弱类型: 在像java这样的强类型的语言中,即使我定义两个方法签名完全一样的接口或者类,他们还是不同的类型,相互之间不能转换,比如:
interface A{
void methodA();
}
interface B{
void methodA();
}
,而在javascript中,只要你两个对象只要有相同的方法,那就能用一个对象来代替另一个,比如a.xxx();只要我有一个对象有xxx方法,那么我可以用任意的对象来代替a,同样的,灵活,但是不小心也容易犯错。世界总是这么的辩证,没有完美的东西,呵呵
还有就是上面的各种函数调用pattern中的this的绑定的对象,这些搞明白了,其他的基本就是routine work了。
je的插入代码好像不是很好用阿,排版老是搞不好,只能直接在里面敲代码。
分享到:
相关推荐
Most programming languages contain good and bad parts, but JavaScript has more than its share of the bad, having been developed and released in a hurry before it could be refined. This authoritative ...
NULL 博文链接:https://wenbois2000.iteye.com/blog/898175
JavaScript: The Good Parts 英文pdf版
包含中文版和O’Reilly原版两本书。 这是一本介绍 JavaScript 语言本质的权威书籍,值得任何正在或准备从事JavaScript 开发的人阅读,并且需要反复阅读。
javascript:the good parts
JavaScript:The Good Parts May,英文原版,带书签,高清版本
JavaScript the good parts/JavaScript 语言精粹 中文+英文
javaScript the Good parts中文版
JavaScript语言精粹(修订版)是一本介绍JavaScript语言本质的权威书籍,值得任何正在或准备从事JavaScript开发的人阅读,并且需要反复阅读。学习、理解,实践大师的思想,我们才可能站在巨人的肩上,才有机会超越大师...
js语言精髓呗,跟js权威指南一起的.
英文原版,适用于Amazon Kindle and Amazon Kindle for PC
JavaScipt的非常好的资料 实用方便
JavaScript the good parts 经典课程
在《JavaScript:The Good Parts》一书中,Crockford深度分析了一堆好的意图和盲目的错误,为你提供了所有JavaScript的地道优良部分的细节,包括: ·语法·继承·方法 ·对象·数组·风格 ·函数·正则表达式·美丽...
e文版,chm格式,JavaScript学习经典书籍
Since 1996, JavaScript: The Definitive Guide has been the bible for JavaScript programmers—a programmer's guide and comprehensive reference to the core language and to the client-side JavaScript APIs...
[JavaScript权威指南(第6版)].(JavaScript:The.Definitive.Guide).David.Flanagan.文字版.pdf