第四章主要讲的是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的插入代码好像不是很好用阿,排版老是搞不好,只能直接在里面敲代码。
分享到:
相关推荐
JavaScript: The Good Parts 是 Douglas Crockford 著名的一本书,它深入探讨了JavaScript语言的精华部分,帮助开发者避开语言中的陷阱并充分利用其优势。这篇读书笔记将聚焦于书中的核心概念和重要知识点。 首先,...
《JavaScript的精华部分笔记》是基于道格拉斯·克罗克福德(Douglas Crockford)的著作《JavaScript: The Good Parts》的一份详细注解。这份开源资源深入解析了JavaScript语言中最为核心、最有价值的部分,帮助...
"LearningJS: 通过 Crockford 和其他来源的 Good Parts 书学习 JS" 提到的学习资源,很可能是指 Douglas Crockford 的《JavaScript: The Good Parts》一书和其他相关材料。这本书是 JS 开发者的经典之作,Crockford ...
《JavaScript The Good Parts》是Douglas Crockford所著的一本深入探讨JavaScript语言核心特性的书籍。在学习JavaScript的过程中,理解假值(falsy values)以及全等运算符(===)是非常重要的。假值是指在...
关于道格拉斯·克罗克福德的《 JavaScript的精髓》 :rocket: 这些都是书上的笔记Javascript the Good Parts ,其于2008年出版,ES6之前。 在撰写本文时,该书尚未发布任何修订版,有关此方面的持续讨论,请参见 。 ...
在JavaScript编程中,作用域和闭包是两个非常重要的概念,它们对于理解代码的执行流程以及如何有效地管理变量至关重要。本文将深入探讨这两个主题,并举例说明如何使用它们来避免全局空间污染。 首先,我们来看看...
在探讨JavaScript编程语言时,作用域、闭包和避免全局变量污染是几个非常重要的概念。作用域决定了代码块中变量和其他资源的可见性和生命周期,闭包是JavaScript中一个强大的特性,它允许函数访问并操作函数外部的...
附件中的《OReilly.JavaScript.The.Good.Parts.May.2008.pdf》可能是这本书的电子版,详细解释了JavaScript语言的各个方面,对于理解webOS的JavaScript开发非常有帮助。而“Kristen Stewart.jpg”可能是无关文件,与...
前端面试笔记 可能在前端职位面试中出现的有用笔记和算法的集合。 仅供学术使用。 Challenges.js 包含一些在 JS 中...crockford.js 包含来自“Javascript the Good Parts”的注释 dom.js 包含有用的 DOM 方法和属性