[英]Why functions are objects in javascript?
请向我解释为什么函数是JavaScript中的对象? 对象是具有属性的结构。 属性的值可能是一个函数,我们将此属性称为-方法。 但是我们不能执行对象。 我们不能这样做:
var cat = {name: 'Murzik', age: 17};
cat();
但是我们可以执行功能
var func = function() {
alert('Hello world!');
};
func();
那么,如果函数是对象,为什么我们可以这样做呢? 请帮我理解! 谢谢!
因为ECMAScript规范是这样说的:
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.