为什么我可以将一个语句而不是一个函数传递给这个JS?

时间:2014-03-06 05:09:07

标签: javascript

我知道你可以在JS中使用函数作为参数。

当我将语句alert(" d")作为参数传递时 - 一切都会触发。

 dc.embed.load('http://www.documentcloud.org/search/embed/', {some json
    }, alert("d"));

但是当我传递一个完整的函数时 - 语句就不会触发。

 dc.embed.load('http://www.documentcloud.org/search/embed/', {some json
    }, function() {
    alert("d");
});

为什么可能会发出警报 - 但匿名功能不会触发?

3 个答案:

答案 0 :(得分:5)

在第一种情况下,您正在调用alert("d")并将结果undefined作为第三个参数传递给函数。因此,警报在您的load函数被调用之前运行。在第二种情况下,第三个参数是一个实际函数,如果它被调用将执行警报。它看起来好像从未被调用过。您需要调查dc.embed.load函数的行为,并查看它如何以及何时调用您传递的函数作为其第三个参数。

答案 1 :(得分:2)

在第一种情况下,您正在调用该函数,在第二种情况下,您正在传递一个函数体,但它没有被调用。

答案 2 :(得分:0)

你根本就没有在第二种方法中调用该函数。我认为,第三种变化可能会帮助你更好地理解它,以及斯科特的回答:

dc.embed.load('http://www.documentcloud.org/search/embed/', {some json
    }, function() {
        alert("d");
    }() // <- note the () here
);

仅发送一个函数就像这样做:

dc.embed.load('http://www.documentcloud.org/search/embed/', {some json
}, alert
);

所以我的第一个例子(有点)匹配你的第一个例子,因为被调用的函数,不仅仅是传递它。另外,我的第二个例子与你的第二个例子匹配,因为我们只是将函数体作为参数传递。

要了解最简单的示例,请在这些情况下比较变量的值:

var a = alert;
var a = alert('hey');

他们尝试,例如:

a('hello there'); // for both cases