JavaScript添加函数脚本 - 有人可以解释一下
javascript add function script - can someone explain?
我在一个应该按名称在对象中创建函数的示例中查找这段代码。据我了解,它也可以在对象上创建相同函数的重载。
function addMethod(object, name, fn) {
var old = object[name];
object[name] = function(){
if (fn.length == arguments.length)
return fn.apply(this, arguments)
else if (typeof old == 'function')
return old.apply(this, arguments);
};
}
所以如果创建一个新对象,例如
var ninja = {};
而不是添加以下功能:
addMethod(ninja,'whatever',function(){ /* do something */ });
addMethod(ninja,'whatever',function(a){ /* do something else */ });
addMethod(ninja,'whatever',function(a,b){ /* yet something else */ });
该对象应包含 3 个 WHATEVER 函数的重载。
我不明白的问题 addMethod 函数:
我知道我们将最后一个函数存储在旧函数中。我们以这种方式创建闭包吗?使用匿名功能?
因此,要执行此行代码:
else if (typeof old == 'function')
return old.apply(this, arguments);
它将递归调用之前定义的所有函数,直到匹配?
有人可以解释一下吗?
谢谢
但不明白我们使用新的匿名函数存储什么
代码的要点是根据传递的参数数调用不同版本的函数。
如果您不将函数的旧版本存储在某处,则无法调用它。
为什么我们将 fn.lenth 测试到参数长度(args.arguments 不是总是 3 的吗?
函数的length
属性是预期参数的数量,即创建它的函数声明或函数表达式的(
和)
之间的标识符数量。
arguments
对象的length
属性是实际传递给它的参数数。
请参阅此示例:
function myFunction(foo, bar) {
document.body.appendChild(
document.createElement("br")
);
document.body.appendChild(
document.createTextNode(
"The function was called with " + arguments.length + " arguments"
)
);
}
document.body.appendChild(
document.createTextNode(
"The length of the function is " + myFunction.length
)
);
myFunction();
myFunction("a", "b", "c", "d", "e");
好的,我将尝试用示例进行解释,想象一下:
var obj = {
foo: function() {}
};
var foo2 = function(arg) {};
调用addMethod(obj, 'foo', foo2)
会将obj.foo
替换为创建的匿名函数。是的,这是一个封闭,里面fn
永远是foo2
.
下次调用obj.foo
时,将调用匿名函数。在闭包fn
(等于 foo2
(内,它的length
等于foo2
期望接收的参数数量,arguments.length
等于实际接收的参数数量
obj.foo(1);
在这种情况下,fn.length
和 arguments.length
都是 1,然后foo2
被调用我发送的参数。
obj.foo();
在本例中,fn.length
为 1,但arguments.length
为 0闭包将检查是否存在old
函数并调用它传递参数(在本例中没有(。
如果您使用新函数再次调用addMethod
,它将递归查找,直到找到接收相同数量的发送参数的函数或到达最后一个函数。
var foo3 = function(arg1, arg2) {};
addMethod(obj, 'foo', foo3);
obj.foo(1, 2); // will trigger foo3
obj.foo(1); // will trigger foo2
obj.foo(); // will trigger the original foo
添加具有相同参数数的函数将使旧函数永远不会再次被调用。
var foo4 = function(arg) {};
addMethod(obj, 'foo', foo4);
obj.foo(1); // will trigger foo4
args.arguments不是总是3吗?
不,arguments.length
表达式最直接地在内部函数表达式object[name] = function(){ ... }
内部,而不是addMethod
。因此,arguments
是指传递到object[name]
上定义的函数(即新定义的函数(中的参数。
- 你能解释一下这个阶乘函数是如何工作的吗?
- 你能解释一下为什么这个javascript不正确吗
- 有人能向我解释一下我犯的一个错误吗
- 有人能解释一下evaluate()和dragAndDrop()在下面的角度测试代码中调用了什么吗
- 有人可以解释一下这个变量的声明方式
- 你能解释一下下面的javascript吗?
- 有人可以解释一下Object.defineProperty如何在javascript的构造函数中工作
- 有人可以向我解释一下代码的JavaScript / Ajax部分是做什么的
- 有人能向我解释一下:将元素附加到目标与将元素分配到目标
- 有人能解释一下;r'的对象在下面的代码示例中执行
- 有人能向我解释一下为什么我们在这个函数中需要一个for循环吗
- 谁能解释一下这句话的意思吗;var upload_file_count_text=+filenames.length++
- 有人能解释一下如何#ifeq吗/section键使用handle.js工作
- 请解释一下“;立即调用函数表达式“;以及“;自调用匿名函数”;
- 你能解释一下第 3 章 Eloquent js 中的这个递归解决方案吗?
- 有人可以解释一下这段代码在做什么吗?调用 Class.create() 时实际会发生什么
- 有人可以解释一下这个JavaScript / Angular代码是如何工作的
- 你能解释一下 javascript 中的返回吗?
- 有人可以解释一下这些javascript概念吗?
- 你能解释一下这种奇怪的函数声明行为吗?