Javascript的箭头功能
我在铬选项卡控制台中运行的代码块,但我不能
明白为什么是第二个块的输出NaN.The值传递应该在第二种情况下不包括b,其中应该不重要的是我的想法。Javascript的箭头功能
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
但是当我做
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)); //output: NaN
call
作为第一个参数接受在被调用的函数中将被用作this
(称为context
)的值。因此,在第二个示例中(f.call(a,n)
)a
被认为是上下文参数,而n
被认为是f
函数第一个参数 - 因此,结果您的f
函数实际上仅用单个参数调用,因此第二个参数为undefined
- 它相当于调用f(n)
但f
函数需要两个参数。作为一个内部函数的结果,你将数字添加到undefined
,它给你NaN
。
一件事澄清:
因为this
调用箭头函数的第一个参数(上下文)call
方法被忽略时,不沿箭头功能绑定,它不会被用作箭头函数内部this
值但在你的第二个例子是不会引起你的probem的,即使你使用的仍然存在
由于这不受箭头函数的限制,因此该参数将被忽略。当我做console.log(adder.addThruCall(3,4,5))时,它也返回NaN。但它应该有一个4 + 5 +1即10 –
不会。当你调用'f.call(a,n)'时,你实际上是这样做的:'f(n)' - 'f'函数被调用了SINGLE参数第二个参数是“未定义”。调用方法的第一个参数不是作为参数传递给被调用函数,而是作为上下文传递。请检查'调用'文档以全面了解它:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call –
()方法调用一个函数在给定单独设置这个值和参数。
而不是使用调用,你可以直接返回f(a,n);
我想了解call/apply的概念。 –
正常功能的问题在你的代码的第二部分:
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);
}
在这种情况下如果我做console.log (adder.addThruCall(3,4,5));它应该返回给我一个结果,但它返回NaN。 –
因为'f'没有收到'n'作为参数。 'f.call(a,n)'是问题所在,它没有为'f'提供第二个参数。 'f.call'需要3个参数来做你想做的事情。 –
我想我知道了如果我保留 var adder = { base:1, add:function(a){ var f = v => v + this.base; 返回f(a); }, addThruCall:function(x,y)var f =(v,n)=> v + n + this.base; var b = { base:2 }; 返回f.call(x,y,2); } }; console.log(adder.addThruCall(3,4,5)); // O/P 7 –
fn.call的第一个参数()是“这'的论据。所以'f。call(a,n)'与调用'f(n,undefined)'相同,'f'中的'a'是'this'。因此,你从NaN号得到NaN + undefined = NaN – Shilly