奇怪的javascript函数行为

时间:2016-08-03 09:14:34

标签: javascript

这里有一些关于js忍者秘密的例子:

function addMethod(obj, methodName, fn) {
    const old = obj[methodName];


  obj[methodName] = function () {
    if (fn.length === arguments.length) {
      return fn.apply(this, arguments);
    } else if (typeof old === 'function') {
      return old.apply(this, arguments);
    }
  };
}

let ninja = {};

addMethod(ninja, 'whatever', a => console.log(`one: ${a}`));
ninja.whatever(1);
addMethod(ninja, 'whatever', (a,b) => console.log(a, b));
ninja.whatever(2, 2);
addMethod(ninja, 'whatever', (a,b, c) => console.log(a, b, c));
ninja.whatever(3);
console.log(ninja);
console.dir(addMethod);

我无法理解为什么在这个变量

const old = obj[methodName];

作为此功能工作

a => console.log(`one: ${a}`)

我认为必须有这个功能

(a,b) => console.log(a, b)

因为它是在ol之前写的

2 个答案:

答案 0 :(得分:1)

所有'旧'函数都保持存在,因为每次调用'addMethod'都会创建一个不同的变量'old'(只能在'addMethod'函数体分隔的范围内访问)

答案 1 :(得分:0)

您的addMethod个函数设置obj[methodName]

function () {
    if (fn.length === arguments.length) {
         return fn.apply(this, arguments);
    } else if (typeof old === 'function') {
         return old.apply(this, arguments);
    }
}

你得到的是什么......