Javascript 为什么我可以向这个JS传递语句而不是函数?

Javascript 为什么我可以向这个JS传递语句而不是函数?,javascript,Javascript,我知道在JS中可以使用函数作为参数 当我传递作为参数发出警报的语句时,一切都会触发 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()

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

当我传递作为参数发出警报的语句时,一切都会触发

 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");
});

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

在第一种情况下,调用alertd并将未定义的结果作为第三个参数传递给函数。因此,警报在调用加载函数之前运行。在第二种情况下,第三个参数是一个实际函数,如果调用它,它将执行警报。看起来好像从来没有人叫过它。您需要研究dc.embed.load函数的行为,并查看它如何以及何时调用作为第三个参数传递的函数

第一种情况是调用函数,第二种情况是传递一个函数体,但它没有被调用

第二个方法中没有调用函数。我认为这第三种变体可能会帮助您更好地理解它,以及Scott的答案:

dc.embed.load('http://www.documentcloud.org/search/embed/', {some json
    }, function() {
        alert("d");
    }() // <- note the () here
);
所以我这里的第一个示例与您的第一个示例相匹配,作为调用的函数,而不仅仅是传递它。另外,我的第二个示例与您的第二个示例相匹配,因为我们只是将函数体作为参数传入

为了通过最简单的示例了解其工作原理,请比较以下情况下的变量值:

var a = alert;
var a = alert('hey');
例如,他们尝试:

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

什么是dc.embed.load?是因为你的dc.embed.load函数中缺少了一个括号吗?@Dai我认为这就像jquery load-但是代码来自一个不同的库。请注意,您不能用JavaScript传递语句。不是我,但我确实认为您的第一个示例可能会让事情变得一团糟。在你的第二个例子末尾附近有一个打字错误。更正,谢谢@ScottSauyet。我试图用最简单的方式解释和展示那里发生了什么,以及每种方法的结果是什么。我说这只是对你答案的一点补充我希望那天有人能这样向我解释。
a('hello there'); // for both cases