test为公开js函数调用//怎么都不能调用?

为什么const对象只能调用const成员函数,而不能调用非const成员函数? - 阿瞒123 - 博客园
在c++中,我们可以用const来定义一个const对象,const对象是不可以调用类中的非const成员函数,这是为什么呢?下面是我总结的一些原理。
假设有一个类,名字为test代码如下:
1 class test{
4   void print();
5   test(int i);
我们知道c++在类的成员函数中还会隐式传入一个指向当前对象的this指针,所以在test类中,实际的print函数应该是这样的void print(test * this);,这代表一个指向test对象的指针this被传入到了print函数中
假如现在我们用test类创建一个对象,
1 test obj1(12);
2 obj1.print();
第二句,obj1.print();其实相当于print(&obj1);,即把当前的对象obj1的指针传递到print()函数,这是没问题的
如果用test类创建一个const对象,然后去调用print()函数呢?这就会出现问题
const test obj2(122);
obj2.print();
这时obj2对象的指针就会传递给test *this 指针,而obj2的地址翻译成指针类型应该是这样的,const test* this,即这时会出现类型不匹配的错误,在visual studio 中会出现类似于下面的错误:
所以通过上面的说明,我们知道了为什么const 对象不能调用非const成员函数。
下面解释为什么const 对象可以调用const成员函数,
1 class test{
void print()const;
前面我们把非const成员函数print(),翻译了一下,同样const成员函数也要翻译,void print() 可以翻译成 void print(const test* this);,那么常量对象的地址翻译是const test* 是和void print()中this指针的类型是一样的,所以常量对象可以调用const成员函数。
有一个点要注意,在c++中其实是有最小权限原则的,非const对象是可以调用const成员函数的
阅读(...) 评论()
Copyright & 阿瞒123
Powered by:
模板提供:C++函数调用的问题,函数原型为void test(int a,int b=7,char=&*&)._百度知道关于JS的简单代码 哪里出了问题 为什么不能调用test()函数_百度知道这个类的成员怎么不能被调用?_百度知道jQuery创始人知道function test(){}这样定义函数不好吗?
在javascript语言精粹这本书里指出…function test( ){ }这样定义函数是不好的,推荐用: var test = function( ){ }。 既然函数function test( ){ }这样定义函数不规范,违反了 先定义后执行 的特点,那么为什么好多优秀的资料(比如精通javascript....)仍然这样写?是因为jQuery创始人他不知道吗?
你可以尝试把DC和JR拉在一起让他们讨论这个问题,他们应该会用眼角瞟你一眼,嘀咕一句“这人傻了吧”,然后高兴地相互搂着腰去吃饭了……很显然蝴蝶书就是一本给入门者看的,你100%遵循里面的原则会达到“不容易写出糟糕代码”的程度,但这不代表以下2点的任何一点:你不会写出糟糕的代码不遵循这些原则就一定写出糟糕的代码先定义后使用?你信不信2个函数相互调用的时候直接就精分了?var test = function () {}就一定好?你信不信ES7继续往下推出function decorator的时候不能对这种形式定义的函数用?JR是什么水平的人大家都知道,虽然我个人还是小小地不爽他的代码风格的,但其是JavaScript方向上站在山顶看我们努力攀爬这一点,是很难有人反对的到这个层次的人,他知道应该做什么,怎么做是好的,他的目标已经从“遵循某个教义”变为了“写出好的代码”,某些教义只是他的工具,工具不适合的场景就换工具,如此简单我自己也不认为蝴蝶书里的所谓原则有多大的好处,对于函数定义这一点我的规则是:定义后不会再变的,用函数定义定义后这个变量的值还会变的,如要做一次bind的,或者要在某个if里改为其它函数的,用var在分支、循环里的,一概用var
我想知道你们看了 Haskell 的 where 语法又该怎么想呢?——补充,我看前面还是没有讲清楚,其实根本没有什么「先定义后执行」原则。请问赞同这个原则的人,什么叫「先定义」?你们能解释清楚吗?如果是指函数代码必须写在其调用之前,那么如此你的代码必将变得难于阅读。因为这样就是让所有函数按照倒置的Dependency Graph进行排列,最末端最底层的工具函数放到最前面,而高层的业务逻辑代码反而出现在最后面。你打开一个程序,先映入眼帘的是一些琐碎的工具函数代码,拖到下面才看到主体逻辑,这合理吗?看:function convert(arrayOfModel) {
function mark(model) {
// 如果 mark、isValid 函数代码有几十行,
// 你自己看看是将它写在前面好还是后面好?
function isValid(model) {
return arrayOfModel.map(mark).filter(isValid);
那为什么会有「先定义后执行」这种说法呢?—— 其实压根没这说法啊!回去把书多读几遍看,哪本书说函数定义必须写在调用前面的?那明明是「先声明再使用」啊,「声明 Declaration」和「定义 Definition」分得清吗?像C语言中,你必须在调用之前先写上函数声明,不然编译器会猜错。C语言中可以单独写函数声明,但JS这类语言函数定义声明无法分开来写。像《Java编程思想》那样推荐将 public 方法写在 private 方法前面,岂不是总是与你们不知从哪儿听来的「先定义再使用」的原则相悖了? JavaScript中函数声明语句有Hoisting,所以不存在什么先声明先定义的麻烦,本就是为了让你写的爽,你却不领情? 至于什么时候用 var 什么时候用函数声明语句,赞同
的规则。————Babel作者写的一个插件Demo,我感觉明明是在嘲讽DC啊:Bob hates function declarations with a passion (nobody knows why). Bob loves to enforce this on his
coworkers, he's snuck this plugin into their build system to force his tyrannical code style.PS:Please don't be like Bob.
尽信书则不如无书。别教条主义。
那是因为题主你假设 JavaScript 语言精粹的作者 Douglas Crockford 的水平要比 jQuery 作者 John Resig 的水平高。然而事实并不见得是这样。这两个人都曾经是 ECMA TC39 的成员,对 JavaScript 有足够的了解,不会存在连这些常见做法都不知道的情况。John Resig 不这样写,只是他不见得赞同 Douglas Crockford 的观点,觉得 function test() {} 完全 OK 而已。JavaScript 语言精粹是一本充满了作者偏见的书,有些偏见可能是对的,有些偏见可能是错的,没必要因为作者是个砖家就一概信之,兼听则明就好。
只要你知道它们各自有什么区别,使用有什么结果,就可以合理利用,这两种方式并没有很明显的好坏之分。而这本书里,作者是有个人偏好的,不能全信。你这种情况有点像,拿到一个锤子,看哪都像钉子。
违反了又咋滴~
这个写法也不能算是不好。甚至我还听说过这种写法更好。我记得有种说法是,如果用 var fn = function () {}
的方式定义函数,那么这个函数在抛错的时候,trace 记录里会显示这是个匿名函数。而用 function fn () {} 的形式定义则是具名函数。不懂现在 vm 对于这一块是不是做过优化,效果一样了。如果把函数看做一等公民的话,确实 var fn 的形式看起来更统一。而且 coffeescript 翻译过来的代码也是长这个样子的。但说起来哈, 的代码也是喜欢写 function fn () {} 这种形式的。jquery 的作者内力高深,在这种复杂度完全不高的地方,选择了一个他更习惯的。仅此而已啦。
function test(){}这种方式还是有自己的使用场景的,比如将辅助逻辑后置,突出主要逻辑,方便代码阅读者理清整体结构。举例如下:function veryLongFn(request, response) {
var email = request.data.
var name = request.data.
if (!isEmailValid(email)) {
response.end('error');
if (!isNameValid(name)) {
response.end('error');
// 验证通过,执行相关代码
function isEmailValid() {
// 可能有五十行代码
function isNameValid() {
// 可能有一百行代码
}}上面的代码中,其他人来阅读的时候,第一眼看见的代码就是简洁的主干逻辑代码,不会被有点长的验证代码吓住。当然,一般情况下,示例中的验证函数会被提出来,方便其他地方复用。此处的例子仅是为了说明这种风格明显增加了代码的可读性。
虽然的确是 C 系语法的历史遗留没错,但两者还是有区别的,这大概也是没有被废弃的原因之一,譬如 var a = function b(){},你可以试着赋值或是打印来看看 a b 的区别。最后唠叨一句,闭包函数(特别是回调场景)不匿名才是真正的好习惯,不要问为什么,多实践多编码,自己慢慢去体会。
已有帐号?
无法登录?
社交帐号登录

我要回帖

更多关于 js函数调用 的文章

 

随机推荐