繁体   English   中英

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

[英]Why functions are objects in javascript?

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

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

但是我们可以执行功能

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

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

因为ECMAScript规范是这样说的:

4.3.24功能

Object类型的成员,它是标准内置Function构造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 

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

仅仅是因为它们是……这就是语言设计师决定要做的事情。

如果对象是可调用的,您期望发生什么? 您可以将对象视为存储,将功能视为可以执行的东西。 同样,函数不是对象,但它们是它们的超集。 由于这个库,像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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM