call()和apply()Javascript?

时间:2016-06-10 14:43:59

标签: javascript

var a = function() { }; //Just a function

当我在控制台中运行a.__proto__时,它返回了此

function () {}

那么,如果在javascript中创建的每个函数的原型都是如上所述的函数,那么究竟在哪里调用call(),apply()和bind()?

2 个答案:

答案 0 :(得分:3)

这些功能确实存在于a.__proto__(或链中的其他部分) - 您所看到的问题更多的是它在控制台中的表现方式。例如,如果您只是在控制台中执行a,那么您也会看到空函数字符串,但没有您已知道的__proto__属性。

由于@squint指出in the comments,如果您使用console.dir,则会显示其他属性:

enter image description here

答案 1 :(得分:0)

  

如果在javascript中创建的每个函数的原型都是如上所述的函数,那么确实调用了call(),apply()和bind()等方法吗?

正好在那个函数/ pobject上。 Function.prototype是一个函数,但它与其他函数不同。它定义为§8.2.2 CreateIntrinsics

  

8。让 noSteps 成为算法步骤的空序列   9.让 funcProto CreateBuiltinFunction realmRec noSteps objProto )。
  10.将 intrinsics 。[[FunctionPrototype%]]设置为 funcProto

它是一个内置函数,但它自己的原型在这里被设置为默认对象原型(objProto),而不是它自己(你不能有循环原型链)。

然后该算法的第13步说明所有内在值都需要根据规范中的某些人和某些部分进行递归初始化:

  

使用上面尚未处理的Table 7中列出的值设置内在函数的字段。字段名称是表格第一列中列出的名称。每个字段的值是一个新的对象值,并且使用第18-26节中每个对象的规范定义的属性值进行递归填充。 [...]

该表包含:

  

%FunctionPrototype% | Function.prototype | property

的原型数据%Function%的初始值

§19.2.3描述了该对象的所有属性,包括您提到的属性。