我想了解javascript中函数和函数之间的关系。
让我举个例子:
Function.prototype.bind // function () { [native code] }
var foo = function () {};
foo.bind; //function () { [native code] }
我的问题是
Function.prototype.bind
和foo.bind
是指相同的代码?
如果是,有人可以向我解释这种关系吗?
答案 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这样的短语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