javascript中函数和函数之间的关系

时间:2012-09-18 14:43:12

标签: javascript prototype

我想了解javascript中函数和函数之间的关系。

让我举个例子:

Function.prototype.bind // function () { [native code] }

var foo = function () {};
foo.bind; //function () { [native code] }

我的问题是 Function.prototype.bindfoo.bind是指相同的代码?
如果是,有人可以向我解释这种关系吗?

5 个答案:

答案 0 :(得分:3)

是的,任何function() {}的原型始终指向Function原型。一个简单的方法是使用深度相等来检查:

var foo = function () {};
foo.bind === Function.prototype.bind // -> true

您实际上可以使用new运算符创建一个Function实例并传递正文和参数(尽管不建议这样做):

var f = new Function("return 'hello world'");
f() // -> hello world

答案 1 :(得分:1)

也许你,就像我几周前一样,想知道在这个(在外部函数中)添加函数和通过prototype关键字添加它之间的区别。关键的区别在于,后者仅在原型对象中添加一次,而第一次(将新函数分配给此并返回此函数)将在每次创建函数(对象)的新实例时添加。 / p>

我发现这篇文章非常好:Use of 'prototype' vs. 'this' in JavaScript?

答案 2 :(得分:0)

是的,请查看:

> (function (){}).bind === Function.prototype.bind
true

并证明它不仅仅是字符串相等:

> (function(){} === function(){})
false
> ((""+function(){}) === (""+function(){}))
true    

这是因为任何功能的内部[[Prototype]]字段(可以使用__proto__在Google Chrome中访问)始终为Function.prototype

> Function.prototype
function Empty() {}
> (function (){}).__proto__
function Empty() {}
> Function.prototype === (function (){}).__proto__
true

如果在对象中查找给定名称的字段但未找到,则遵循原型继承链,直到找到具有该字段的对象。在这种情况下,我们的函数没有bind属性,因此bind取自原型:

> (function (){}).__proto__.bind
function bind() { [native code] }

答案 3 :(得分:0)

所有JavaScript function [objects](如foo)都是Function constructor的实例,并且继承自Function.prototype。你可以轻松检查它:

> (function foo(){…}) instanceof Function
true
> (function foo(){…}).bind === Function.prototype.bind
true

答案 4 :(得分:0)

  

Function.prototype.bind和foo.bind引用相同的代码?

绝对!您可能遇到过像 JavaScript这样的短语 JS中的函数式语言,函数是第一类对象。这意味着属性和方法的逻辑适用于函数,就像它们对任何对象(数组,日期,对象......)一样。主Function包含定义所有基本属性的原型和所有功能都有的方法。不是将新函数对象分配给每个函数,而是将它们分配给所有函数对象所指向的1个对象更有效。

这意味着,就像其他人在这里指出的那样:

function foo()
{};
foo.bind === Function.prototype.bind;

但这也意味着您可以扩充原型和各个函数对象:

Function.prototype.getName = function()
{
    return this.name;
}
foo.getName();//foo

再次,这里foo.getName === Function.prototype.getName,但是一旦我们直接分配给一个函数对象:

foo.getName = function(){ return 'bar';};

理所当然foo.getName !== Function.prototype.getName ...只是使用Function原型,以及它如何单独影响每个函数的行为。这很有趣; P