我刚学习NodeJS和/或PhantonJS。 作为一个有很多C经验的程序员,我不喜欢编写NodeJs代码的方式,并且发现它有点混乱/不可读。 (对不起,如果我褶皱任何羽毛)
本着清理代码的精神,我试图这样做并找到了一个块。 在C或C ++中,我们应该能够通过名称传递函数,但在NodeJS / PhantomJS中它似乎不起作用。 我做错了吗? 有人可以向我解释一下Javascript解释器是如何看待它的吗?
var page = require('webpage').create();
var printS = function (s) {
console.log(s);
phantom.exit();
}
/* This works */
page.open('http://net.tutsplus.com', function (s) {
console.log(s);
phantom.exit();
});
/* This does not work
page.open('http://net.tutsplus.com', printS(status));
*/
/*But this works
page.open('http://net.tutsplus.com', function (s) { printS(s);} );
*/
答案 0 :(得分:1)
page.open('http://net.tutsplus.com', printS(status));
失败是因为您没有传递函数,而是调用status
上的函数的结果。如果你想传递这个功能,你可以这样做
page.open('http://net.tutsplus.com', printS);
答案 1 :(得分:1)
我认为有更广泛的解释可能会有所帮助。让我们开始简单:
在JavaScript中,我们有值和变量。变量是值的容器。几乎在我们可以使用值的任何地方,我们都可以使用变量。
在JavaScript源代码中,我们通过 literals 表达值,例如:数字文字42
。我们可以直接将该值传递给函数:
f(42);
此外,我们可以将变量传递给函数:
,而不是直接传递值var v = 42;
f(v);
也就是说,我们可以用变量代替值。
让我们考虑一下
var printS = function() { ... };
这显然是一个变量,其值是一个函数。如果我们直接将该值传递给函数(即我们将函数传递给函数),它看起来像:
f(function() { ... }); // similar to f(42)
这正是你在第一种情况下所拥有的:
page.open('http://net.tutsplus.com', function (s) {
// ...
});
由于我们知道可以使用变量替换值,因此我们可以将function() { ... }
替换为printS
:
var printS = function() { ... }; // similar to var v = 42;
f(printS); // similar to f(v)
所以你的例子将成为
page.open('http://net.tutsplus.com', printS);
有什么问题
page.open('http://net.tutsplus.com', printS(status));
然后?
请注意,您在printS
之后添加了其他字符,即(status)
。它们没有出现在您内联函数的第一个示例中:
page.open('http://net.tutsplus.com', function (s) {
// ...
});
这里没有(status)
。因此,这两个结构不能不等同。
page.open
接受函数值作为第二个参数,但printS(status)
不评估函数printS
,它调用函数printS
并将返回值传递给page.open
。
为什么
page.open('http://net.tutsplus.com', function (s) { printS(s);} );
工作?
让我们删除函数的内容和参数,它变为:
page.open('http://net.tutsplus.com', function () { ... } );
这看起来与上面的例子完全一样。 function () { ... }
,是一个函数文字,可以这么说。它创建了一个函数值。之后没有(...)
调用函数。
答案 2 :(得分:0)
这并不像你希望的那样工作,因为page.open想要一个函数作为它的第二个参数......这个回调模式在JavaScript中很常见。在你的工作示例中,printS以status为参数被调用,并返回undefined。由于undefined不是一个函数,它不会按照你的意愿行事。
在浏览器控制台或节点repl:
中> printS = function (s) { console.log(s); };
function (s) { console.log(s); }
> typeof printS('hi');
hi
"undefined"
> typeof function (s) { printS(s); };
"function"
关于JavaScript的另一件事是它的动态类型和相当慷慨的类型强制可能会导致令人困惑的行为,没有任何有用的错误可以指出你的问题的根本原因。调试器或大量使用console.log()通常有助于理解这些问题。