2

関数とjavascriptの関数の関係を理解し​​たいと思います。

例を挙げましょう:

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

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

私の質問は、同じコードを参照していますか
Function.prototype.bind? はいの場合、誰かが私に関係を説明できますか?foo.bind

4

5 に答える 5

3

はい、任意のプロトタイプは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

たぶん、数週間前の私のように、これに関数を追加すること(外部関数の内部)とプロトタイプキーワードを介して追加することの違いについて疑問に思っているかもしれません。主な違いは、後者はプロトタイプオブジェクトに一度だけ追加されるのに対し、最初の関数(これに新しい関数を割り当ててこれを返す)は、関数(オブジェクト)の新しいインスタンスを作成するたびに追加されることです。

私はこの投稿が本当に良いと思いました:JavaScriptでの「プロトタイプ」と「これ」の使用?

于 2012-09-18T15:01:53.527 に答える
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 に答える
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関数[オブジェクト](などfoo)はFunctionコンストラクターのインスタンスであり、から継承しFunction.prototypeます。あなたはそれを簡単にチェックすることができます:

> (function foo(){…}) instanceof Function
true
> (function foo(){…}).bind === Function.prototype.bind
true
于 2012-09-18T14:54:21.990 に答える