函数在Javascript中被调用为不同类型的对象.这有道理吗



希望你一切顺利。在没有学习编程的几年后,我开始学习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)

相关内容

  • 没有找到相关文章

最新更新