Javascript箭头功能

时间:2017-02-23 10:12:35

标签: javascript

我在chrome选项卡控制台中运行两个代码块,但我无法使用 理解为什么第二个块NaN的输出。在第二个案例中传递的值应该不包括b,这应该不重要就是我的想法。

to_value(my_data_frame, keep.labels = T)

但是当我做的时候

var adder = {
  base: 1,

  add: function(a) {
    var f = v => v + this.base;
    return f(a);
  },

  addThruCall: function(a,n) {
    var f = (v,n) => v + n + this.base;
    var b = {
      base: 2
    };         
   return f.call(b,a,n);
  }
};
console.log(adder.addThruCall(3,4)); // output: 8

2 个答案:

答案 0 :(得分:1)

call因为第一个参数接受将在被调用函数中用作this(称为context)的值。因此,在第二个示例中,f.call(a,n)a被认为是上下文参数,n被认为是f函数的第一个参数 - 因此您的{{1}函数实际上只用一个参数调用,所以第二个参数是f - 它等同于调用undefinedf(n)函数需要两个参数。因此,在内部功能中,您需要为f添加号码,这样可以undefined

还有一件事要澄清:

因为在箭头函数上调用NaN方法时this没有绑定箭头函数,所以忽略第一个参数(上下文)并且它不会在箭头函数中用作call值但是在你的第二个例子中,它不是你的探测器的原因,即使你使用正常功能问题仍然存在

答案 1 :(得分:1)

在代码的第二部分:

var adder = {
 base: 1,

 add: function(a) {
   var f = v => v + this.base;
   return f(a);
 },

 addThruCall: function(a,n) {
   var f = (v,n) => v + n + this.base;
   var b = {
     base: 2
   };         
   return f.call(a,n);
 }
};
console.log(adder.addThruCall(3,4));  

如果你专注于console.log(adder.addThruCall(3,4)) 它确实:

return f.call(3, 4) // where 3 is the context specified and 4 is the argument 

这意味着你打电话,

f(4, undefined) // called with 4

不只是,你要回来了:

v + n + this.base

现在,

4 + undefined + 1

那是NaN

为了更好的可视化,请使用:

addThruCall: function(a,n) {
 var f = (v,n) => {
   console.log(v, n, this.base)
   return v + n + this.base;
 }
 var b = {
   base: 2
 };         
 return f.call(a,n);
}

解决方案:

addThruCall: function(a,n) {
  var f = (v=0,n=0) => v + n + this.base;

    var b = {
      base: 2
    };         
   return f.call(a,v,n);
  }