2017-08-08 90 views
2

我是功能编程的新手,我很难理解以下功能的实际情况。Javascript高级功能

const someFnc = arg => arg("You can print that string :)"); 
someFnc(msg => console.log(msg)) 

从我能理解的是,我实际上将函数传递给函数someFnc。但是,函数arg怎么可以自我调用为arg(...)(在我的例子中是一个字符串参数)? 我真的很困惑这个概念。

+1

'arg'不是自我调用的。调用在'someFnc'的函数体中('arg(“您可以打印该字符串:)”)')。 – Xufox

+1

我不确定你的意思是“自我激励”。 'someFnc'调用它在执行时声明为参数的函数'arg'。 – Bergi

回答

3

如果你打破它拆开,你可以看到这是怎么回事:

function someFunction(fn) { 
    fn('hello') 
} 

function logFunction(msg) { 
    console.log(msg) 
} 

someFunction(logFunction) 

从本质上讲,someFunction需要这应该是一个函数的参数(fn)。

然后它传递一个字符串("hello")作为该函数的参数(fn('hello'))。

someFunction然后执行它收到的功能,所以它正在执行logFunction('hello')

logFunction需要一个字符串参数和控制台日志它(console.log('hello')

箭头功能((arg) =>)是编写function(arg) { }的简写。

0
const someFnc = arg => arg("You can print that string :)"); 

仅仅是让匿名的方式:

function someFnc (arg) { 
    arg("You can print that string :)"); 
} 

您定义的其他匿名函数:

msg => console.log(msg) 

这使得anoynous函数,它msg,它使用一个呼叫到console.log。由于它只是用第一个参数调用console.log,因此它是一个不做任何事情的包装。你的确可以只用console.log替换为:

someFnc(console.log) 

现在使用替代规则,我们可以用替换为绑定变量参数的函数体替换函数调用,从而:

arg("You can print that string :)");  // replace arg with console.log 
// === 
console.log("You can print that string :)"); 

现在,当您使用JavaScript编写裸字时,如parseInt,它是一个变量。它评估为一个函数。因此parseInt("10"); // ==> 10。在函数的主体arg中是一个变量,它获取对象console上的属性log的值。它是一个像parseInt一样的功能。变量是值,函数也是值。

当您将值传递给函数时,它将绑定到定义中的变量。它甚至可以阴影现有的其他功能:

((parseInt, value) => parseInt(value))(Number, "10"); 
// => 10 

这样,规则与参数替换约束变量,因此它是真的:

Numer("10"); //=> 10 

变量仅供值的名称。一个函数是一个值,你可以在()之后应用,可选地包含参数。

+0

_“只是匿名的方式”_ - 从ES 2015开始,上面代码片段中的函数将具有[推断的函数名称](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Function/name#Inferred_function_names)'someFnc'。 – Xufox

+0

@Xufox是的,那是真的。它使调试更容易,分析器从最近的绑定中修饰函数对象,但分配的表达式使得匿名函数成为可能。 IMO'((fun => fun.name)(()=> 1)''也可以返回'fun',但它不会。 – Sylwester

+0

不是msg => console.log(msg)一个lambda函数不是包装器? – JtR