NodeJs或PhantomJS上的NewBee: Javascript上的函数名
NewBee on NodeJs or PhantomJS: Function names on Javascript
我只是学习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()通常有助于理解这类问题。
- 从函数JavaScript返回不可变数组/对象
- 将对象传递给函数.JavaScript
- 如何定义const函数javascript(语法糖)
- 新的日期函数javascript
- TypeError:this.getAttribute不是一个函数-javascript
- 从函数javascript发送变量
- 扩展自容器函数Javascript
- 从内部函数javascript内部分配外部函数的对象
- 使用函数JavaScript中的函数
- 在这里使用回调函数(JavaScript)有什么好处吗
- 来自函数 Javascript 的 NaN 返回值 ||函数执行顺序
- 将“e”传递给一个新函数 - javascript
- 调用函数中的一个函数——Javascript
- 传递的变量不适用于我的函数-Javascript
- 如何将类方法设置为等于多个函数?-Javascript
- 显示php中的函数javascript
- 如何使用php代码创建函数Javascript弹出框
- 未调用的外部函数-javascript
- 如何在类中运行函数.Javascript
- 关闭mouseover上的一个函数——Javascript,jQuery