为什么函数是javascript中的对象?

为什么函数是javascript中的对象?,javascript,function,object,Javascript,Function,Object,请向我解释为什么函数是javascript中的对象? 对象是具有属性的结构。属性的值可能是一个函数,我们称之为属性-方法。 但是我们不能执行一个对象。 我们不能这样做: var cat = {name: 'Murzik', age: 17}; cat(); 但是我们可以执行这个函数 var func = function() { alert('Hello world!'); }; func(); 那么,如果函数是对象,为什么我们可以这样做? 请帮我理解! 谢谢你 如果一个对象是可调用

请向我解释为什么函数是javascript中的对象? 对象是具有属性的结构。属性的值可能是一个函数,我们称之为属性-方法。 但是我们不能执行一个对象。 我们不能这样做:

var cat = {name: 'Murzik', age: 17};
cat();
但是我们可以执行这个函数

var func = function() {
    alert('Hello world!');
};
func();
那么,如果函数是对象,为什么我们可以这样做? 请帮我理解!
谢谢你

如果一个对象是可调用的,您希望发生什么?您可以将对象视为存储,将函数视为可以执行的对象。此外,函数不是对象,而是对象的超集。由于这一点,像jquery这样的库和原型继承都是可能的,原型继承就是用JavaScript创建类的方式

function Car() {
    this.tires = 4;
}

Car.prototype.hi = function() {
    console.log("hi");
}

var myCar = new Car();

console.log(myCar.tires); // 4
myCar.hi(); // hi
和静态方法

Car.bye = function() {
    console.log("bye");
}

Car.bye(); // bye
myCar.bye(); // this is an error

这就是语言的设计方式。函数是引用类型(它们作为指针传递),JavaScript引用类型可能有子引用。我认为你正在努力将C++或java的对象模型(结构化与特权方法)与另一种语言提供的类型糖相协调。 我不确定Brendan Eich在什么时候选择将函数实现为对象的实例,但我怀疑其原因是它与将函数设置为一级变量是一致的。对象已经作为变量类型存在,使用现有变量类型对函数建模可能是有意义的。你得直接问他

一个方便的副作用是,它允许我们在函数上存储元数据。这在执行缓存或执行任何其他需要在函数调用之间保持状态的操作时非常方便:

function myCachedFunction(argument) {
    myCachedFunction.cache = myCachedFunction.cache || {};
    myCachedFunction.cache[argument] = myCachedFunction.cache[argument] || operation();

    return myCachedFunction.cache[argument];

    function operation() {
        // performs action with argument
        // only gets called if no cache lookup for argument
    }
}
有些函数还需要知道调用它们的时间。这可以通过闭包变量实现,但函数字段有时是一个更优雅的解决方案:

function getUniqueID() {
    getUniqueID._calls = getUniqueID._calls || 0;
    return getUniqueID._calls++;
}

因为ECMAScript规范这么说:

作为标准内置对象实例的对象类型的成员
函数
构造函数,可以作为子例程调用

注意

  • 某些对象不可调用:

    var obj = {};
    typeof obj; // "object" --> It's not callable
    obj(); // TypeError: obj is not a function
    
    var obj = Object.create(Function.prototype);
    obj instanceof Function; // true --> It's a Function instance
    typeof obj; // "object" --> It's not callable
    obj(); // TypeError: obj is not a function
    
  • 有些对象是可调用的,但不是函数:

    var obj = document.createElement('object');
    typeof obj; // "function" --> It's callable
    obj instanceof Function; // false --> It's not a function
    
    function obj(){}
    typeof obj; // "function" --> It's callable
    obj instanceof Function; // true --> It's a Function instance
    
  • 有些对象是可调用的,并且是函数:

    var obj = document.createElement('object');
    typeof obj; // "function" --> It's callable
    obj instanceof Function; // false --> It's not a function
    
    function obj(){}
    typeof obj; // "function" --> It's callable
    obj instanceof Function; // true --> It's a Function instance
    
  • 并非所有
    函数
    实例都可调用:

    var obj = {};
    typeof obj; // "object" --> It's not callable
    obj(); // TypeError: obj is not a function
    
    var obj = Object.create(Function.prototype);
    obj instanceof Function; // true --> It's a Function instance
    typeof obj; // "object" --> It's not callable
    obj(); // TypeError: obj is not a function
    

    • 仅仅因为他们是。。。这就是语言的设计者决定要做的。

      Javascript的设计者只是决定一个函数将从一个对象派生,因此它本身就可以有属性。你还想要什么样的答案?数组也是从对象派生的。函数是派生对象,因此它具有常规对象的所有功能以及在派生实现中添加的一些附加功能。这就是继承的工作原理。如果你真的对javascript很认真,并且了解它与其他语言的区别,我会挑选一份Douglas Crockford的《javascript:好的部分》。如果您认为函数在javascript中有一种时髦的味道,那么您会喜欢truthy/falsy、闭包和javascript数学之类的东西。0.1+0.2==0.3为false。函数是对象,但对象不是函数。这是什么意思?不是等价的。@劳伦斯-浮点数学等价的怪癖不是JavaScript独有的。不是独一无二的,但在地雷中:)我不知道如何用英语解释它…:(我不明白函数是什么样子的?如果我们在一个对象中有一个方法,我们当然可以调用它。
      var obj={method:function(){alert(1)}}};obj.method();
      但是我们如何调用函数呢?如果我们认为一个对象是一个具有属性的存储,那么调用函数时我们调用的是什么方法。@Kotik-没有方法调用。函数只是一种引用类型,它有额外的能力去引用一个过程。@Kotik:我们调用一个内部“调用”方法。当函数是基元值时,使用
      apply
      toString
      甚至不需要任何特殊情况。方法同样适用于其他基元类型well@Bergi-是的,那是真的。我想这不可能是设计背后的原因。尽管我注意到,在primiti上的方法ves是非常不连贯的-你可以在字符串上分配字段,但分配会陷入黑洞。你可能会说不一致是与原语而不是函数有关;我想知道Eich和co是否只是觉得扩展字符串太“奇怪”,因此打破了他们自己的模型以保持“直观性”。