2015-02-17 67 views
1

我知道这是一个愚蠢的问题,所以请放轻松。 我无法理解在一般的文档,例如这个页面: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map了解Javascript文档

有人能解释什么是'回调'CurrentValue的'指数“阵”(在这方面)和“thisArg”在非常基本的外行的话?我确定这很简单,但它不会在我的大脑中点击,而且它让我自己学习语言非常困难,所以我非常感谢他们的帮助。

+3

我不认为这是一个愚蠢的问题,我也不同意投票结束。它很广泛,但不是过于宽泛,一个简单的(技术)答案不能覆盖它。 – 2015-02-17 20:55:30

+1

'callback'和'thisArg'只是*标签*,指的是应该传递给'.map'的参数。该文件也可以说“第一个参数....”。类似地,'currentValue','index'和'array'是传递给第一个参数('callback')的参数的标签。 – 2015-02-17 21:15:14

+0

嗨,非常感谢你的回答,我非常感谢,真的没有期待任何回应!我知道这将是显而易见的,但由于某种原因,我无法解决这个问题。感谢大家的回答,然后在js控制台上玩游戏,我现在似乎已经把我的头转过来了。 – user2487861 2015-02-20 20:53:12

回答

2

callback是您传递给地图的函数。它将通过参数currentValueindexarray进行调用。

[1, 2, 3].map(function(currentValue, index, array) { 
     console.log("currentValue", currentValue); 
     console.log("index", index); 
     console.log("array", array); 
    }); 

日志:使用记录回调

例如

currentValue 1 
index 0 
array [1, 2, 3] 
currentValue 2 
index 1 
array [1, 2, 3] 
currentValue 3 
index 2 
array [1, 2, 3] 

注意,函数没有内联,这是平等的:

function mapper(currentValue, index, array) { 
     console.log("currentValue", currentValue); 
     console.log("index", index); 
     console.log("array", array); 
    } 

    [1, 2, 3].map(mapper); 
+0

...和'thisArg',如果提供(这非常不寻常)提供参数,当回调函数执行时它将是'this'。 – 2015-02-17 20:51:50

+0

@Esailija @Scott Sauyet感谢您的解释。我在控制台中玩过一段时间,当我像下面的例子那样做'num'参数是'currentValue'部分时,我是否正确思考?如果是的话,我想知道你可以用'index'和'array'参数做什么?你会用什么样的情况? 'var numbers = [1,4,9]; (函数(num){ return num * 2; });' – user2487861 2015-02-20 21:06:34

+0

我花了很多时间在[函数式编程库]上工作(https://github.com/ ramda/ramda),默认情况下不提供这些;实际上我认为最好不要拥有它们。 :-)。也就是说,它们可以是有用的,尤其是'index':var stretch = arr.map(function(el,idx,list){return idx == 0?“start”:el> = list [idx - 1] ?“增加”:“减少”;})'。应用于'[3,1,4,1,5,9,2,6]',这会产生['开始','减少','增加','减少','增加','增加', “减少”,“增加”]。但他们往往不需要。 – 2015-02-20 21:21:32

1

map方法有两个参数。回调和范围参数。

回调是您设置的处理功能。它有三个参数,可以将当前迭代的状态显示为数组上的映射循环。

var myArray = [1,2,3,4,5]; 
 

 
function callback (currentValue, index, array) { 
 
    console.group("callback called"); 
 
    console.log("currentValue:", currentValue); //Current value of the index aka `array[index]` 
 
    console.log("index:", index); //current index of the loop (think of it as a for loop (var i=0; i<array.lenght; i++) It would be i. 
 
    console.log("array:", array); //The array you are looping over..aka a reference to myArray 
 
    console.groupEnd("callback called"); 
 
    return currentValue * 2; 
 
} 
 

 
var result = myArray.map(callback); 
 
console.log(result);

而且[]中的方法声明[, thisArg]指出该参数/参数是可选的。

+0

谢谢你的解释,如果'currentValue'就像for循环一样,我可以在数字中加入一个数字作为第二个参数,以便在数组的不同位置开始迭代? (希望是有道理的!)还是那些纯粹的参数,所以你可以看到实际的'index'和'array'被执行? – user2487861 2015-02-20 21:10:32

3

我会尽量让它变得简单易懂。

回调函数作为参数传递给函数(像age被传递给foo在下面的示例)和一定的事件之后执行。它被称为回调,因为它不是在函数(回调函数作为参数传递给它)本身执行之前执行的。

例如:

function foo(age, function callBack()) { 
    print("I am " + age + " years old"); 
} 

function gender() { 
    print(" and male"); 
} 

function certainEvent() { 
foo(99, gender); 
} 

如果你现在打电话certainEvent(),结果将是:

I am 99 years old and male 
+0

谢谢您的详细和易于理解的解释,我终于把我的头围绕它。 :) – user2487861 2015-02-20 20:55:13

+0

这不是语法上有效的javascript – Esailija 2015-02-20 22:19:38

+0

我意识到这一点。没有必要使用javascript语法来解释回调的原则。 – treegarden 2015-02-20 23:12:16

2

.map是一个函数。函数通常接受参数。你所指的部分更详细地描述了参数及其目的。让我们来看看功能的签名

arr.map(callback[, thisArg]) 

这告诉你该函数有两个参数,其中第二个参数是可选的(由[...]表示)。

该文档选择名称第一个参数“回调”和第二个参数“thisArg”。它可能选择了不同的名字,根本没有名字,只是简单地提到了“第一”和“第二”的论点。

当然,选定的名字带有一些含义,但这只是次要的。完全命名它们是为了能够在文档中稍后引用这些参数。只要看到callback(即格式化为代码)的文档中为.map,如

值作为this执行callback时使用。

你知道它指的是第一个的说法。

类似地,“currentValue”,“index”和“array”是传递给第一个参数.map(“callback”)的参数的标签,因为该参数也应该是一个函数。

currentValue本身并不意味着什么。但是,在.map的上下文中,它指的是传递给第一个参数.map的第一个参数。它的含义在文档中有描述:

正在数组中处理的当前元素。


在此之前,我们写功能的典型方式。当你声明一个函数时,你通常会给出参数名称。例如:

function first(arr) { 
    return arr[0]; 
} 

这里我给的第一个参数名称arr这样我就可以参考它更容易稍后。文档中也会发生同样的情况:参数/参数会得到一个名称,以便以后可以轻松引用它。