希望你一切顺利。在没有学习编程的几年后,我开始学习Javascript。我学到的第一件事是Java和面向对象编程。我记得类和方法等重要部分。研究Mozilla网站上的Javascript并给出解释,他们说函数是另一种对象。
对我来说,这没有意义,因为一个物体就像一只猫。函数更像是一个动词,一个某物或某人所做的动作,就像猫的跳跃。向人们解释功能不是对象,而是动作,而不是看到它也是对象,这不是更好吗?
对我来说,宾语就像句子的主语。比如:你在工作;。句子的宾语/主语是";你"动作/动词/功能是";工作";。例如,我们不能说";Run dance"因为";运行";是一个函数,而不是一个对象。这有意义吗,还是我疯了?哈哈
谢谢朋友们。
函数可以做的事情,但它们仍然是的事情。作为一个人,你可以做一些事情,但你仍然是某些东西。你可以拥有描述你的特质,同时保持你采取行动的能力。功能相同。
向人们解释函数不是对象,而是动作,而不是看到它也是对象,这不是更好吗?
在JavaScript中,函数也是对象。在Java中,你必须经历反思;在JavaScript中,它更直接,函数自动成为一个对象。在Java中,您必须通过反射来获得(例如)参数计数。在JavaScript中,它只是函数的length
。
这不是";"更好";或";更糟的是;它只是是。编程语言包含数百甚至数千种关于如何组织事物的选择。JavaScript的组织方式与Java有很多不同。如果没有个人偏好,这通常不是";"更好";或";更糟";做X或Y,只是不同。
编程既复杂又独特。它并不像其他任何东西那样真正。然而,我们人类需要努力克服它
因此,许多编程概念使用了英语中已经存在的单词。我们把这些东西叫做"物体"。我们本可以选择称它们为"floobargles",或"bultizats"——选择一个没有内在含义的词来避免混淆。但这也有缺点:如果你学习一门语言的第一步是先学习500个完全独特的单词,你会完全迷失方向。
因此,一个困境:
使用具有既定含义的单词,如"object"、"method"、"function"、"actor"、"language"、(代码的)行、"reference"、《pointer》、"instantating》(我们可能正徘徊在编造全新单词的边缘),等等:这些单词已经具有的含义很有帮助;这些都不是任意选择的,一个对象(在Java语言规范的意义上)是什么和做什么的很多都很像一个对象。但是,不可避免的是,在某些情况下,这个比喻会失败,事实上会完全把你引向错误。
但是,使用新创造的单词,对于那些新接触该语言的人来说,学习曲线是不正常的。
真是进退两难。
我记得一些非常善意但最终完全错误且极具误导性的帖子,关于为什么不应该使用异常作为控制流。它的要点是:
对控制流使用异常就像在高速公路旁设置保龄球道式保险杠,然后在保险杠之间随意弹跳,在路上行驶。
这里所犯的错误是,"exception"一词暗示了该词英语意义上的错误——一个关键的错误,是需要避免的。但这并没有出现在语言规范中。在Java Lang规范(或ECMAScript规范,相当于JLS的javascript规范)中,没有任何地方说"应该避免"异常。恰恰相反。此外,当汽车撞在保险杠之间时,人类也不喜欢被人推搡。代码执行不是人,代码没有感情。它不会在乎的。关于使用Exception机制进行控制流,肯定会有一些争论(或者更确切地说,建议应该而不是这样做的争论),但"就像保龄球馆上的保险杠"不是其中之一。
正确的论点包括性能,或者解释它是如何导致"意大利面条"的(这本身就是一个俚语,意思是:人类很难凭直觉理解其"流动"的代码)。如果将异常改为"whutsits",则同样有效的参数。
具体谈谈你的困境
在javascript中,函数可以像值一样分配给变量。此行:
var x = 5;
是有效的javascript,也是有效的java。(使用新的var
关键字,它只是为显而易见的东西键入声明;它与您可能更熟悉的int x = 5;
-java仍然是类型化的,x
变量的类型在这里是int
,在java中。Javascript仍然是非类型化的。您可以稍后在Javascript中而不是在java中为x
分配字符串)。
然而,这是有效的javascript:
var x = function(a, b) { return a + b; }
但无效的java1,关键的是,x的作用完全相同。你可以绕过x
(你现在把一个函数传给,如果我们坚持这个词的纯英语含义,就会开始变得非常奇怪。但离这远一点——利用大脑的可塑性来模糊这些词在英语中的含义与在lang规范中的含义之间的界限,传递函数的想法真的不难理解转到其他功能)。你可以问x它是什么样的对象(它会说:我是一个函数)。
换句话说,x
现在指向一个函数,它也是一个对象。就像在物理学中一样,光既是波又是粒子,两者都不是(光在某些方面根本不像波,也有一些方面根本不像粒子),javascript中的函数也是如此。它们在某些方面像物体,而在其他方面则不同。
真正的问题只是沟通。书/教程/告诉你";函数就像对象";实际上是试图传达一些需要更多单词才能表达的东西。例如,他们的意图是传达这样的想法:;javascript中的函数可以写在值所在的任何地方,也可以存储在值所在地,它们甚至是字典(见下文),可以像值一样传递;。
在他们的头脑中,"函数就是对象">正好涵盖了这一点,因此对他们来说,这只是一种更简单的表达方式。
所以,他们的大脑告诉他们的嘴发出声音,你的耳朵听到这些声音,你大脑。。。得出了一个完全不同的结论。
这只是沟通的失败:言语被说出,你理解了基本含义(你没有听错),但使用言语的目的是沟通,而这在这里并没有发生。他们的意思是一回事,而你理解的是另一回事。
它总是发生在各种不同的环境中。编程在这方面绝非独一无二。
结果是:那又怎样,对吧?如果你认为"函数就像对象"根本不正确,那并不意味着你错了,也不意味着说"函数就像物体"的人错了。这可能只是意味着你对这些词的含义有一个非常根本的不同想法。一般来说,没有一个独裁者能决定一个特定的词的含义,谁会下令杀死任何没有以坚定的方式使用这个词的人。
同样,你遇到麻烦的地方是沟通。如果整个星球上的其他人听到"对象"这个词时都会产生X的想法,而你是唯一一个产生相反想法Y的人,那么你生活在自己的小世界里,这是一件坏事:编程是团队的努力。即使你自己写代码,你也会阅读教程、书籍、使用库、编写文档等等。速记、行话和俚语不可避免地会渗入文档中,如果你只是没有想到其他人都在想的事情,那么你的文档就无法被其他人阅读,你也无法阅读其他人编写的文档。
这里面有一个复杂的问题:尽管每一点行话的真正含义都没有独裁的来源,但恰恰相反(每个人都可以选择他们认为任何一点行话意味着什么,这都是同样有效的)会导致混乱。每个人都需要对此做出自己的决定。
然而,某些单词在官方规范中被使用和明确定义,或者在整个社区的所有程序员中都有99%以上的一致性。显然,对于这些话来说,最好只是随波逐流。
javascript的"object"可能就是其中之一。在javascript中,对象具有可以设置和读取的属性:
var x = {};
x["hello"] = "goodbye";
console.log(x.hello); // prints 'goodbye'.
x(); // fails; x is not a function.
奇怪的是,你可以对函数这样做:
var x = function() {};
x["hello"] = "goodbye";
console.log(x.hello); // works
x(); // works fine - x is a function that does nothing.
console.log(x.hello); // still works, prints 'goodbye'.
因此,"函数也是对象"。是的,在这一点上,这些单词的英语基本含义开始变得令人困惑。一件事怎么可能是动词,但或多或少也是名词?在英语里,这是个愚蠢的想法。
在javascript中,这就是事实。无论你需要想出什么单词或明喻,让你的大脑很容易直觉到事情的方式(也就是说,你阅读了一些javascript代码,并几乎立即正确理解它的作用),都要这样做。大多数人认为说"函数就是对象"是实现这一目标的方法。但也许对你来说,这只是令人困惑。没关系。
[1] 类似Runnable r = () -> {};
的东西是有效的java,但那里发生了完全不同的事情:该函数定义(() -> {}
-没有参数,什么都不做)被视为一个新创建的匿名命名类的实例,该类的子类型为Runnable,并且实现了它唯一的abstract
方法:void run();
,而该函数就是它。
是的,这没有多大意义,但在JavaScript 中就是这样做的
示例:
// create a function
function run() {
console.log('run')
}
// calls a function
run()
// adds a property to a function like to an object
run.x = 5
console.log(run.x)
// adds a functions to the function
run.another = () => console.log('another function')
run.another()
// checks if the functions is an instance of Object
console.log(run instanceof Object)