Javascript 函数基本上是对象类型,这怎么可能呢?

Javascript 函数基本上是对象类型,这怎么可能呢?,javascript,Javascript,我正在学习JavaScript。大多数材料都说JavaScript只有3种基本类型:数字、布尔值、字符串和2种特殊的基本值:null、未定义。其他的都是对象类型,包括数组、函数、正则表达式 我可以很容易地想象数组是一种特殊的对象,但为什么函数也是对象类型呢?对象和函数之间没有相似之处。如何实现像函数一样工作的特殊对象?我不知道。没有办法实现像函数一样工作的对象,但可以将函数用作对象 var a = function(){} a.x = 5; console.log(a.x); 所有东西都

我正在学习JavaScript。大多数材料都说JavaScript只有3种基本类型:数字、布尔值、字符串和2种特殊的基本值:null、未定义。其他的都是对象类型,包括数组、函数、正则表达式


我可以很容易地想象数组是一种特殊的对象,但为什么函数也是对象类型呢?对象和函数之间没有相似之处。如何实现像函数一样工作的特殊对象?我不知道。

没有办法实现像函数一样工作的对象,但可以将函数用作对象

 var a = function(){}
 a.x = 5;
 console.log(a.x);
所有东西都是这样一个物体的原因只是一个设计选择,对一些人来说,这被认为是优雅的。我特别不同意,但一般来说,人们不同意某些事情

另外,我应该注意到,可能有一点是,JS函数是一流的。这意味着您可以像使用任何其他值一样使用函数,包括将它们作为参数发送到其他函数和从函数返回函数等等。举例如下:

// return functions from function
function create_a_function_that_doubles_numbers(){
    return function(a){ return a*2; }
}
var double_number = create_a_function_that_doubles_numbers();
console.log(double_number(5)); // 10

// sending a function to a function
function call_twice(f){ 
    f(); f();
};
function shout(){
    alert("HEY");
};
call(shout); 
// Here we send "shout" to "call_twice" which... calls it twice, 
// so a "HEY" popup appears two times.

实际上,函数经常被用作对象。例如,Angular有
$http
,您可以将其作为低级函数调用,也可以将
$http.get()
$http.post()
作为速记和更具表现力的代码调用。hmmm,我认为使用函数作为对象有时很有用,以限制变量的作用域是全局的……例如,在编写jQuery插件或闭包/模块模式中的javascript时,函数作为对象是非常常见的。事实上,这个建议是误导性的。在JavaScript中经常会遇到高阶函数,这并不是一个糟糕的做法。我想你指的是将函数用作对象,即贴图或关联数组。。。但这并不是“对象”的定义,在“一切都是对象”的意义上取点,去掉了所指的部分。请随意编辑答案,以使其更丰富。请注意,高阶函数与它们是对象无关,如果这是你的意思的话。请看一下本文中的“作为一等公民的函数”一节。这篇文章短小精悍。