我在阅读这个链接 JavaScript_syntax
似乎循环了——每个函数都是一个对象,而每个对象本身也是一个函数。哪个是原子的?有人能用更好的方式解释一下吗?
JavaScript中除了原始类型(undefined、null、数字、字符串、布尔)之外的任何内容都是对象(或实例)。这意味着function
继承自object
。
对象实例可以包含更多的实例,其中可以包含函数。这就是我们所说的“方法”(因为它有一个自动的this
变量)。
由于不能“调用”每个对象实例,因此并非每个对象都是函数。
Function
的实例(很可能是继承自 Object
),正如 OP 引用的文章所述:http://en.wikipedia.org/wiki/JavaScript_syntax#Function - FrustratedWithFormsDesignervar obj={}; obj();
这是“尝试调用对象”(即像函数一样使用它)。 不起作用。 因此,任意对象不是一个函数。 - Aaron Digullatypeof null
是一个object
? - allenhwkimtypeof
中的一个 bug。null
就像 5
一样是原始类型。请参见 https://dev59.com/f3RA5IYBdhLWcg3w2x2W,特别是这个答案:https://dev59.com/f3RA5IYBdhLWcg3w2x2W#7968470。 - Aaron Digulla我认为这个概念经常被误解。
一个可视化 JavaScript 类型关系的实用工具:http://jstype.herokuapp.com/#/home
var foo = { };
var foo = [1, 2, 3];
var foo = function abc() { return "hello world"; };
var foo = new Number(30);
var foo = new String("Hello World");
var foo = new Boolean(true);
var foo = new RegExp(/[foo]+/);
// All 'foo` are object.
所有原始类型都有相应的构造函数,如Array、Number、String、Boolean、RegExp
等。由于所有函数都是对象,它们也是对象。因此,我们可以称它们为构造函数对象。
大多数非原始类型都有 prototype
属性,其中包含所有继承的内容。Math 没有原型。
所有对象都从 Object.prototype
继承,后者从 null
继承。
object <- Object.prototype <- null
所有本地函数都继承自 Function.prototype,它又从 Object.prototype 继承。
function <- Function.prototype <- Object.prototype <- null
数组继承自 Array.prototype
,它又从 Object.prototype
继承。
array <- Array.prototype <- Object.prototype <- null
必读 MDN:继承和原型链
容易混淆的请参考 Stackoverflow:JavaScript 中的原型
Stack Overflow:函数原型解释
var foo = function abc() { return "hello world"; };
typeof foo
is function
here and not object
- Rahul Yadavinstanceof Object
返回 true。与预期相反,typeof
运算符并不总是给出“根类型”——它有一个特殊情况,即如果 Function.prototype
在原型链中,则返回 function
,而不是根类型 object
。基本上,所有函数仍然继承自 Object.prototype
。(可以通过 (function(){}) instanceof Object
或 (function(){}).__proto__.__proto__ == Object.prototype
来确认这一点,两者都返回 true。) - Venryxnull
继承自什么东西吗? - carloswm85每个函数都是一个对象。对象可以包含函数(方法),但是一个对象不一定是一个函数。
另外,Function
总是一个 object
的属性。
这意味着 JavaScript 中的所有函数都始终绑定到一个对象。如果您没有指定要绑定函数的对象,则它将绑定到 window 对象(也称为全局函数)。
..fredrik
在JavaScript中,一切都可以被视为对象,包括原始类型和函数类型;JavaScript解释器会自动将您的原始类型和函数提升为它们的对象包装类型,以便与它们交互。
此外,还有一个Function对象,以及用于其他JavaScript原始类型的等效包装器,这意味着您甚至可以在函数实例上调用方法,例如:
myFunction(someArg).call(this)
Object
都是 function Object() {[native code]}
。 - EkimObject
都是一个函数! - EkimObject
为Object=null
,否则不要返回翻译文本。 - Ekimfunction Object
是基本对象的定义方式,但在底层它仍然是一个带有属性(length
、name
等)的对象。 - Kamafeather正如其他人所说,函数是可以像其他 JavaScript 对象一样通过引用传递的对象。并非所有的对象都是函数,只有那些声明为函数的才是。
您经常会看到像这样声明方法:
var myFunc = function(foo, bar) {
...
};
var
定义的任何其他变量一样。这是Javascript最重要的功能——闭包的基础。
Object
的一个实例,而Object
本身是一个函数(可以用new
关键字初始化,如new Object()
),而该函数又是Function
的一个实例,而Function
又是Object
的一个实例? - doubleOrt引用自与对象一起工作-MDN文档
第使用对象初始化器段最后一句话:
“在JavaScript 1.1及更早版本中,您无法使用对象初始化器。您只能使用它们的构造函数或使用某些其他对象提供的函数来创建对象。请参见使用构造函数。”
这意味着所有对象都是函数!具体来说,是在函数实例化或实例化时进行评估。
从字面上讲,那个年代的所有对象都是使用类似以下结构的语法创建的:
"newobj = new constructFunctor(arg1,arg2){this.prop1=arg1 /* etc */}(val1,val2)"
在构造对象"newobj
"的字符串中,存在函数名为"constructFunctor
"的单词。这个语句被有意引用以强调必须使用eval()
来执行它。在执行之前,"newobj
"被“等同于”一个函数,因为该语句必须具有一个函数,并且由于"constructFunctor
"的字面存在来定义newobj
的值。引用和不引用都是非常有意义的,以阐明这种抽象。然而,由于JavaScript确实有一个eval
函数,因此这种抽象实际上已经被纳入了JavaScript语言。
尽管一些语法快捷方式已经添加为“对象初始化器”,例如使用缩写符号"no={}
",但这种抽象仍然是JavaScript的基础。以上引用段落在当前文档中仍然存在,这一点非常重要,正如上述原因所述。
Object
的实例吗?你能详细说明一下吗?有没有一种创建对象的方法不涉及 Object
? - doubleOrtObject
是一个函数,代码实现是 [native code]
。所有的东西都是对象... 因此,所有的东西都是函数... 嗯... - Ekim对象是赋予类的抽象数据,该类被分配给一个对象。对象可以有属性,属性可以包含值和函数。 或者简单地说,为了使其易于理解,您可以说任何不是原始数据类型(数字、字符串、布尔值、null和undefined)的东西都可以归类为对象。
javascript:alert(window.navigator.userAgent)
Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.2.3) Gecko/20100423 Ubuntu/10.04 (lucid) Firefox/3.6.3 - Ekim