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 
+0

fn.call的第一个参数()是“这'的论据。所以'f。call(a,n)'与调用'f(n,undefined)'相同,'f'中的'a'是'this'。因此,你从NaN号得到NaN + undefined = NaN – Shilly

call作为第一个参数接受在被调用的函数中将被用作this(称为context)的值。因此,在第二个示例中(f.call(a,n)a被认为是上下文参数,而n被认为是f函数第一个参数 - 因此,结果您的f函数实际上仅用单个参数调用,因此第二个参数为undefined - 它相当于调用f(n)f函数需要两个参数。作为一个内部函数的结果,你将数字添加到undefined,它给你NaN

一件事澄清:

因为this调用箭头函数的第一个参数(上下文)call方法被忽略时,不沿箭头功能绑定,它不会被用作箭头函数内部this值但在你的第二个例子是不会引起你的probem的,即使你使用的仍然存在

+0

由于这不受箭头函数的限制,因此该参数将被忽略。当我做console.log(adder.addThruCall(3,4,5))时,它也返回NaN。但它应该有一个4 + 5 +1即10 –

+0

不会。当你调用'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);

+0

我想了解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); 
    } 
+0

在这种情况下如果我做console.log (adder.addThruCall(3,4,5));它应该返回给我一个结果,但它返回NaN。 –

+0

因为'f'没有收到'n'作为参数。 'f.call(a,n)'是问题所在,它没有为'f'提​​供第二个参数。 'f.call'需要3个参数来做你想做的事情。 –

+0

我想我知道了如果我保留 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 –