我知道你可以在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");
});
为什么可能会发出警报 - 但匿名功能不会触发?
答案 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