其中调用和应用函数是在javascript中定义的
有人能告诉我调用和应用函数是在java脚本中定义的吗。 最初我认为它们是在Function.prototype对象中定义的,这就是为什么所有函数都从那里继承它们的原因。但当我执行Function.prototype(在Crome控制台中)时,它会给我函数Empty(){} 有人能告诉我这些函数来自哪里,为什么function.prototype指向空方法吗其中调用和应用函数是在javascript中定义的,javascript,Javascript,有人能告诉我调用和应用函数是在java脚本中定义的吗。 最初我认为它们是在Function.prototype对象中定义的,这就是为什么所有函数都从那里继承它们的原因。但当我执行Function.prototype(在Crome控制台中)时,它会给我函数Empty(){} 有人能告诉我这些函数来自哪里,为什么function.prototype指向空方法吗 提前感谢。您看到了正确的行为,第15.4.3节规定: 函数原型对象是 本身是一个函数对象(其 [[Class]]是“函数”),当 调用,接受
提前感谢。您看到了正确的行为,第15.4.3节规定: 函数原型对象是 本身是一个函数对象(其 [[Class]]是“函数”),当 调用,接受任何参数和 返回未定义的 所有函数都是JS中的对象,尽管
函数。事实上,prototype
是一个函数本身,因此call
和apply
不能从该对象继承
如果您进一步阅读第15.4.3节,您将看到apply
和call
是函数.prototype的成员
提示:默认情况下,Chrome以字符串形式输出函数(Function.prototype.toString
)。您可以使用console.dir
,强制它在对象树中显示所有属性:
console.dir(Function.prototype);
你看到了正确的行为,第15.4.3节规定:
函数原型对象是
本身是一个函数对象(其
[[Class]]是“函数”),当
调用,接受任何参数和
返回未定义的
所有函数都是JS中的对象,尽管函数。事实上,prototype
是一个函数本身,因此call
和apply
不能从该对象继承
如果您进一步阅读第15.4.3节,您将看到apply
和call
是函数.prototype的成员
提示:默认情况下,Chrome以字符串形式输出函数(Function.prototype.toString
)。您可以使用console.dir
,强制它在对象树中显示所有属性:
console.dir(Function.prototype);
试一试
您没有看到它们的原因是,内置对象属性/函数通常是不可枚举的<代码>对象。getOwnPropertyNames
是一个函数,用于列出对象的属性,而不考虑可枚举性。它也是EMCAScript5规范中最近添加的一款,但是Chrome应该可以很好地支持它。试试看
您没有看到它们的原因是,内置对象属性/函数通常是不可枚举的<代码>对象。getOwnPropertyNames
是一个函数,用于列出对象的属性,而不考虑可枚举性。这也是EMCAScript 5规范附带的一个相对较新的补充,但Chrome应该可以很好地支持它。以下是WebKit中来自JavaScriptCore(Nitro)的源代码
EncodedJSValue JSC_HOST_CALL functionProtoFuncApply(ExecState * exec) {
JSValue thisValue = exec - > hostThisValue();
CallData callData;
CallType callType = getCallData(thisValue, callData);
if (callType == CallTypeNone) return throwVMTypeError(exec);
JSValue array = exec - > argument(1);
MarkedArgumentBuffer applyArgs;
if (!array.isUndefinedOrNull()) {
if (!array.isObject()) return throwVMTypeError(exec);
if (asObject(array) - > classInfo() == & Arguments::s_info) asArguments(array) - > fillArgList(exec, applyArgs);
else if (isJSArray( & exec - > globalData(), array)) asArray(array) - > fillArgList(exec, applyArgs);
else if (asObject(array) - > inherits( & JSArray::s_info)) {
unsigned length = asArray(array) - > get(exec, exec - > propertyNames().length).toUInt32(exec);
for (unsigned i = 0; i < length; ++i)
applyArgs.append(asArray(array) - > get(exec, i));
} else return throwVMTypeError(exec);
}
return JSValue::encode(call(exec, thisValue, callType, callData, exec - > argument(0), applyArgs));
}
EncodedJSValue JSC\u HOST\u调用函数protofuncapply(ExecState*exec){
JSValue thisValue=exec->hostThisValue();
CallData CallData;
CallType CallType=getCallData(此值为callData);
if(callType==CallTypeNone)返回throwVMTypeError(exec);
JSValue数组=exec->argument(1);
标记参数缓冲区应用程序;
如果(!array.isUndefinedOrNull()){
如果(!array.isObject())返回throwVMTypeError(exec);
if(asObject(array)->classInfo()==&Arguments::s_info)asArguments(array)->fillArgList(exec,applyArgs);
else if(isJSArray(&exec->globalData(),array))asArray(array)->fillArgList(exec,applyArgs);
else if(asObject(array)->继承(&JSArray::s_info)){
unsignedlength=asArray(array)->get(exec,exec->propertyNames().length).toUInt32(exec);
for(无符号i=0;iget(exec,i));
}否则返回throwVMTypeError(exec);
}
返回JSValue::encode(调用(exec,thisValue,callType,callData,exec->argument(0),applyArgs));
}
如果您愿意,您可以通过V8和JaegerMonkey源代码查找它们的实现。我自己找不到。如果有人想给我指出源代码或其他源代码,那很酷:)这是WebKit中来自JavaScriptCore(Nitro)的源代码
EncodedJSValue JSC_HOST_CALL functionProtoFuncApply(ExecState * exec) {
JSValue thisValue = exec - > hostThisValue();
CallData callData;
CallType callType = getCallData(thisValue, callData);
if (callType == CallTypeNone) return throwVMTypeError(exec);
JSValue array = exec - > argument(1);
MarkedArgumentBuffer applyArgs;
if (!array.isUndefinedOrNull()) {
if (!array.isObject()) return throwVMTypeError(exec);
if (asObject(array) - > classInfo() == & Arguments::s_info) asArguments(array) - > fillArgList(exec, applyArgs);
else if (isJSArray( & exec - > globalData(), array)) asArray(array) - > fillArgList(exec, applyArgs);
else if (asObject(array) - > inherits( & JSArray::s_info)) {
unsigned length = asArray(array) - > get(exec, exec - > propertyNames().length).toUInt32(exec);
for (unsigned i = 0; i < length; ++i)
applyArgs.append(asArray(array) - > get(exec, i));
} else return throwVMTypeError(exec);
}
return JSValue::encode(call(exec, thisValue, callType, callData, exec - > argument(0), applyArgs));
}
EncodedJSValue JSC\u HOST\u调用函数protofuncapply(ExecState*exec){
JSValue thisValue=exec->hostThisValue();
CallData CallData;
CallType CallType=getCallData(此值为callData);
if(callType==CallTypeNone)返回throwVMTypeError(exec);
JSValue数组=exec->argument(1);
标记参数缓冲区应用程序;
如果(!array.isUndefinedOrNull()){
如果(!array.isObject())返回throwVMTypeError(exec);
if(asObject(array)->classInfo()==&Arguments::s_info)asArguments(array)->fillArgList(exec,applyArgs);
else if(isJSArray(&exec->globalData(),array))asArray(array)->fillArgList(exec,applyArgs);
else if(asObject(array)->继承(&JSArray::s_info)){
unsignedlength=asArray(array)->get(exec,exec->propertyNames().length).toUInt32(exec);
for(无符号i=0;iget(exec,i));
}否则返回throwVMTypeError(exec);
}
返回JSValue::encode(调用(exec,thisValue,callType,callData,exec->argument(0),applyArgs));
}
如果您愿意,您可以通过V8和JaegerMonkey源代码查找它们的实现。我自己找不到。如果有人想向我指出源代码或其他源代码,那很酷:)您应该执行
console.dir(Function.prototype)
并单击箭头列出其属性。您应该执行console.dir(Function.prototype)
并单击箭头列出其属性。谢谢!!这很有帮助。但是当我反对的时候