2

我想了解 javascript 中 Function 和 function 之间的关系。

让我举个例子:

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

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

我的问题是
Function.prototype.bind并且foo.bind指的是相同的代码?
如果是,有人可以解释我的关系吗?

4

5 回答 5

3

是的,any 的原型function() {}总是指向Function原型。一个简单的查找方法是使用深度相等进行检查:

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

您实际上可以使用new运算符创建一个 Function 实例并传递主体和参数(尽管这确实不推荐):

var f = new Function("return 'hello world'");
f() // -> hello world
于 2012-09-18T14:47:44.587 回答
1

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

我发现这篇文章非常好:在 JavaScript 中使用 'prototype' 与 'this'?

于 2012-09-18T15:01:53.527 回答
0

是的,检查一下:

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

为了证明它不仅仅是在做字符串相等:

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

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

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

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

> (function (){}).__proto__.bind
function bind() { [native code] }
于 2012-09-18T14:49:21.087 回答
0

所有 JavaScript函数 [objects] (like foo) 都是Function构造函数的实例,并且继承自Function.prototype. 您可以轻松检查它:

> (function foo(){…}) instanceof Function
true
> (function foo(){…}).bind === Function.prototype.bind
true
于 2012-09-18T14:54:21.990 回答
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......只是玩弄函数原型,以及它如何单独影响每个函数的行为。挺好玩的;P

于 2012-09-18T14:59:03.110 回答