Javascript:无法从外部传递的函数访问内部函数

时间:2016-01-12 07:43:50

标签: javascript

我正在开发一个项目,其中,我想编写一些插件类型的代码,让开发人员扩展其功能的功能。让我们假设,我想构建一个计算器,并支持在运行中添加功能:

function newCalc(newFn) {
  var fns = $.extend({
    add: function(a,b) {
        done(a+b);
    }
  }, newFn);

  var done = function(num) {
    alert('Outcome is: ' + num);
  }

  return fns;
}

var calc = newCalc({
  substract: function(a,b) {
    done(a-b);
  }
});

calc.add(4, 2);
calc.substract(4, 2);

但是,我没有按照预期得到结果。 calc.add()工作正常,但calc.substract()抱怨done()功能不可用。

任何人都可以帮我解决这个问题吗?我怎样才能完成减法操作?

小提琴:https://jsfiddle.net/PrakharMishra/p4egvuf7/1/

3 个答案:

答案 0 :(得分:3)

问题是done是一个内部函数,不会暴露在外面。 当您执行return fns;时,new Calc将只有fns而没有其他值。

您可以使用this关键字将函数/变量分配给当前上下文。请记住,只需指定this.prop但不要返回它。如果您归还,它将成为公共财产。不返回会将其保密,但可以在所有实例中访问。

您可以尝试这样的事情:

代码

Updated JSFiddle



function newCalc(newFn) {
  var add = function(a, b) {
    done(a + b);
  }

  // This is a private function. 
  // Accessible across all objects but is not available outside
  this.done = function(num) {
    alert('Outcome is: ' + num);
  }

  // Add default properties
  var retObj = {
    add: add
  };

  // Add dynamic properties that are passed as parameters
  var keys = Object.keys(newFn);

  // Loop over all properties passed in object
  for (var i = 0; i < keys.length; i++) {
    retObj[keys[i]] = newFn[keys[i]];
  }
  return retObj;
}

var calc = newCalc({
  substract: function(a, b) {
    done(a - b);
  }
});

calc.add(4, 2);
calc.substract(4, 2);

console.log(calc)
calc.done(1 + 2);
&#13;
&#13;
&#13;

答案 1 :(得分:0)

newCalc函数中的变量fns只能在函数内部访问。当您返回变量done时,外部无法访问变量function newCalc(newFn) { var fns = $.extend({ add: function(a,b) { this.done(a+b); }, done: function(num){ alert('Outcome is: ' + num); } }, newFn); return fns; } var calc = newCalc({ substract: function(a,b) { this.done(a-b); } });

以下是解决方法:

fns

当您返回calc时,完成也包含在其中。

用于初始化另一个变量var calc = newCalc({ substract: function(a,b) { this.done(a-b); } }); 。它应该是这样的:

this

请注意,我将this.done(a-b)放在this上。 fns对象引用newCalc返回的calc.add(4, 2);

因此不会出现ReferenceError语句。当您运行calc.subtract(4, 2);和{{1}}

答案 2 :(得分:0)

你可以在没有如下所示的大变化的情况下做到这一点。

try{ 
    List<Customer> list = (List<Customer>) genericList; 
    list.get(0).methodOfCustomer(); 
    isCustomer = true;}
catch(Exception e){
    isCustomer = false
}