关于在闭包内prototype内建函数的调用问题(高手请绕道)
2010-10-09 14:58
351 查看
如题,这是个蛮基础、满细节、却又蛮重要的问题。(所以说对于把原型,constructor,new关键字等都理解的透彻的高手来说,此文乃小儿科。敬请绕道)
由于之前的编码习惯,一致也没注意这个问题,直到有一天,我突然想换一种方式表达同样的意思的时候,发现了一个小问题。且听我细细道来:
先看一段很傻很天真的代码:
呵呵,好了,现在我们让匿名函数先执行了,应该可以了吧,结果试一下,发现console会报错,this.c is not a function! 纳尼??
一定又会有人吼了,prototype是需要在一个函数对象创建的时候才会生成,你外层匿名函数执行了,但是b()却是没有实例化的,prototype对像都没有生成,当然c没有定义也不可能执行的。
所以,我们还需要对b()实例化,众所周知,用new关键字!!
把刚才的代码稍微换了一下,不用原型了,直接写到返回对象里,同样的,也是创建一个匿名函数赋给a2,但是其实和上面的一样,a2执行完毕之后,它就不再是一个Function对象了,而是一个Object对象了,这个应该很容易理解。那么,上面的代码其实和前一段执行结果是一致的。
我在这里只是想说没有人会在这里还用new关键字了吧。因为这里的c2不是通过prototype内建的,于是,a2对象里的b2函数是可以直接调用的。
(另外,这里还想提一下,两种方式中this.c()和this.c2()中的this指向其实也是不一样的。前一种是指向b,后一种指向对象a2)
还有一点,需要提一下。
通过显式的方式创建的函数,各位觉得怎么才能正确的运行出‘worked!’呢??
由于之前的编码习惯,一致也没注意这个问题,直到有一天,我突然想换一种方式表达同样的意思的时候,发现了一个小问题。且听我细细道来:
先看一段很傻很天真的代码:
var a = function(){ function b(){this.c()} b.prototype.c = function(){alert('worked!')} return {b:b}; }(); a.b();
呵呵,好了,现在我们让匿名函数先执行了,应该可以了吧,结果试一下,发现console会报错,this.c is not a function! 纳尼??
一定又会有人吼了,prototype是需要在一个函数对象创建的时候才会生成,你外层匿名函数执行了,但是b()却是没有实例化的,prototype对像都没有生成,当然c没有定义也不可能执行的。
所以,我们还需要对b()实例化,众所周知,用new关键字!!
/* == */ var a2 = function(){ return{ b2:function(){ this.c2(); }, c2:function(){ alert('worked!'); } } //a2返回的其实是一个对象;所以用a()的方式显式调用会发现报错,a2 is not a function }(); a2.b2();
把刚才的代码稍微换了一下,不用原型了,直接写到返回对象里,同样的,也是创建一个匿名函数赋给a2,但是其实和上面的一样,a2执行完毕之后,它就不再是一个Function对象了,而是一个Object对象了,这个应该很容易理解。那么,上面的代码其实和前一段执行结果是一致的。
我在这里只是想说没有人会在这里还用new关键字了吧。因为这里的c2不是通过prototype内建的,于是,a2对象里的b2函数是可以直接调用的。
(另外,这里还想提一下,两种方式中this.c()和this.c2()中的this指向其实也是不一样的。前一种是指向b,后一种指向对象a2)
还有一点,需要提一下。
a2.constructor有什么不一样,a2.constructor返回的是function,而a2本身却是一个Object,有人可能不太理解。其实这个很简单,仔细想想constructor属性的定义应该就可以明白。 constructor属性是创建对象返回的一个函数参考。所谓函数参考,理所应当就应该是function,a2为Object这个没有争议。 好的,此文大概到这儿。结尾之余还想请各位看官看看下面这几行代码: /* == */ function a1(){ function b1(){this.c1()} b1.prototype.c1 = function(){alert('worked!')} return b1(); }
通过显式的方式创建的函数,各位觉得怎么才能正确的运行出‘worked!’呢??
相关文章推荐
- 关于VC中LineDDA函数的调用问题
- Qt-QML-关于两个平级的qml文件中的函数调用问题
- 关于调用MFC CHttpFile Seek函数抛异常的问题
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- 关于Linux下I2C驱动的Probe方式没有自动生成i2c_client且没有自动调用i2c_driver的.probe指向的函数的问题解决
- 关于opencv中imshow()函数在VS中调用不显示图像的问题
- 关于局部指针变量 函数调用后 该指针的问题
- C#关于静态函数与普通函数之间的调用问题,以及可变参数的使用
- 关于动态存储分配函数的调用,在已经过排序的数组中查找及删除内容的操作,余数的分析,删除字符数组中的空格,对链表的逆置,在源字符串中查找子字符串的个数,函数指针以及函数的调用,循环赋值带来的问题以及插入
- 关于JS中setTimeout()无法调用带参函数问题的解决方法
- 关于VC开发中的函数调用问题
- 关于函数字符数组调用的问题(没有搞清指针的概念)
- 关于基类构造函数调用虚函数实际调用的不是派生类的问题的原因
- C/C++中关于函数调用结束后变量释放的问题
- C++笔试题 关于函数析构函数未调用的问题
- 关于在C#中构造函数中调用虚函数的问题
- 关于,函数调用是传值调用,初始化函数中重新分配内存,导致形参的值和实参的值不一致 问题分析
- 关于类成员函数指针的调用问题
- C++关于函数声明和定义中参数赋值为0调用问题演示
- 关于C51的中断函数要注意的几个问题 -----中断中调用函数参数错误问题