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

时间:2015-02-15 17:08:52

标签: javascript function object

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

var cat = {name: 'Murzik', age: 17};
cat();

但是我们可以执行函数

var func = function() {
    alert('Hello world!');
};
func();

那么,如果函数是对象,为什么我们可以这样做呢? 拜托,帮帮我理解! 感谢的!

4 个答案:

答案 0 :(得分:3)

因为ECMAScript规范如此说明:

  

4.3.24 function

     

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

请注意

  • 某些对象无法调用:

    var obj = {};
    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
    
  • 并非所有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
    

答案 1 :(得分:0)

这就是语言的设计方式。函数是引用类型(它们作为指针传递),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++;
}

答案 2 :(得分:0)

仅仅因为他们......这就是语言设计者决定做的事情。

答案 3 :(得分:-1)

如果某个对象可以调用,您会发生什么?您可以将对象视为存储,将函数视为可以执行的操作。此外,函数不是对象,但它们是它们的超集。由于像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