我在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
答案 0 :(得分:1)
call
因为第一个参数接受将在被调用函数中用作this
(称为context
)的值。因此,在第二个示例中,f.call(a,n)
)a
被认为是上下文参数,n
被认为是f
函数的第一个参数 - 因此您的{{1}函数实际上只用一个参数调用,所以第二个参数是f
- 它等同于调用undefined
但f(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);
}