NodeJs或PhantomJS上的NewBee: Javascript上的函数名

NewBee on NodeJs or PhantomJS: Function names on Javascript

本文关键字:函数 Javascript PhantomJS 上的 NewBee NodeJs      更新时间:2023-09-26

我只是学习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);} );
*/
page.open('http://net.tutsplus.com', printS(status));

失败是因为您没有传递函数,而是在status上调用函数的结果。如果你想传递这个函数,你可以这样做

page.open('http://net.tutsplus.com', printS);

我认为有一个更广泛的解释可能会有所帮助。让我们从简单的开始:

在JavaScript中,我们有变量。变量是值的容器。几乎在任何可以使用值的地方,我们都可以使用变量。

在JavaScript源代码中,我们通过字面值表示值,例如数字字面值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) {
    // ...
});

因为我们知道我们可以用变量代替值,我们可以用printS代替function() { ... }:

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 () { ... }是一个函数字面量。它创建一个函数值。在之后没有(...)可以调用函数

这并不像您希望的那样工作,因为page。Open需要一个函数作为它的第二个参数…这种回调模式在JavaScript中非常常见。在您的不工作示例中,正在以status作为参数调用printS,并且它返回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()通常有助于理解这类问题。