可能的重复:
JavaScript: var functionName = function() {} vs function functionName() {}
Javascript 中的函数表达式与声明之间有什么区别?
我试图了解 javascript 的“最佳实践”。
此代码来自jqfundementals.com
// create a function that will greet a person,
// and assign the function to the `greet` variable
var greet = function( person, message ) {
var greeting = 'Hello, ' + person + '!';
log( greeting + ' ' + message );
};
greet( 'Jory', 'Welcome to JavaScript' );
greet( 'Rebecca', 'Thanks for joining us' );
Run Code Online (Sandbox Code Playgroud)
为什么我应该将函数分配给 greet 变量?
我的第一个冲动是这样写:
function …Run Code Online (Sandbox Code Playgroud) 在Udacity课程中,函数表达式和声明之间的区别解释如下:
函数声明定义函数,不需要为其分配变量.它只是声明一个函数,并且本身不返回值......另一方面,函数表达式确实返回一个值.
这令人困惑; 据我所知,当函数表达式和函数声明都包含return语句时,都返回一个值.
如果我理解正确,返回值的差异在于函数表达式中,如果在函数的第一次调用中更改了值,则在后续调用中将保留更新的值 - 而如果函数未存储在变量中,当函数执行完毕时,将删除返回值.我错过了什么,并且从课程中的陈述准确吗?
注意:我的问题与标记为重复的问题不同.在那个问题中,它询问使用一个在另一个之上的原因是什么,但问题中没有提到或在答案中解释了返回值.
以下片段完全相同吗?如果没有什么是尊重?
var x = (function() {
... //a
return function(){
... //b
};
})();
Run Code Online (Sandbox Code Playgroud)
与
var x;
{
... //a
x = function(){
... //b
};
}
Run Code Online (Sandbox Code Playgroud) 以下是Douglas Crockford的The Good Parts的代码.
在大多数情况下,代码是有道理的.除此之外,我不明白这一行:
var walk_the_DOM = function walk(node, func) {
Run Code Online (Sandbox Code Playgroud)
因为看起来这个函数有两个名字 - walk_the_dom()和walk()
再往下看,你可以看到代码实际上是双向调用的,所以这两个名字实际上都引用了这个函数.
为什么这个函数有两个名字?
// Define a walk_the_DOM function that visits every
// node of the tree in HTML source order, starting
// from some given node. It invokes a function,
// passing it each node in turn. walk_the_DOM calls
// itself to process each of the child nodes.
var walk_the_DOM = function walk(node, func) {
func(node);
node = node.firstChild;
while (node) {
// walk() …Run Code Online (Sandbox Code Playgroud) 我碰巧注意到Javascript也支持Function关键字,就像在ActionScript中一样.由于两者都源自ECMA Script,因此存在这种相似性是常识.但我很好奇函数在Javascript的情况下代表什么,如果不是一个类(如在as3中).
在JS中,
var func = new Function(); 要么 var func = new Function;
为变量'func'指定一个名为'anonymous'的函数.
它可能只是一种以面向对象的方式实现实际"函数"的方法.
由于大多数浏览器(ff,即&chrome)似乎以相同的方式实现它,它是否在规范中得到解决?
我一直在制作简单的Javascript程序,我将为不同的网站为我的朋友运行,我一直在尝试使用按钮制作一个统治风格(使命召唤游戏模式)程序.我看过一个网站,并尝试使用设置的间隔,但我无法弄清楚如何让按钮访问脚本.
这是我的代码:
<!DOCTYPE html>
<html>
<body>
<p id = "blue"></p>
<p id = "red"></p>
<button onclick="StartA()">Start for Red</button>
<button onclick="StopA()">Stop for red</button>
<button onclick="StartB()">Start for Blue</button>
<button onclick="StopB()">Stop for Blue</button>
<script>
var startRed;
var startBlue;
var r=1;
var b=1;
var startA = function(){
var startRed = setInterval(function(){redscore++};,3000)
};
var startB = function(){
var startBlue = setInterval(function(){bluescore++};,3000)
};
var StopA = function(){
clearInterval(startRed);
};
var StopB = function() {
clearInterval(startBlue);
};
document.getElementById("blue").innerHTML=bluescore;
document.getElementById("red").innerHTML=redscore;
</script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud) 我正在浏览这篇关于函数声明和函数表达式之间差异的博客.
它给出了这两个例子.他们将第一个称为"匿名函数表达式",将第二个称为"命名函数表达式".
// anonymous function expression
var a = function(){
return 3;
}
// named function expression
var b = function bar(){
return 3;
}
Run Code Online (Sandbox Code Playgroud)
我在Chrome的JS控制台中测试了这两个,我看到以下内容:
a()
=> 3
b()
=> 3
bar()
=> bar is not defined
Run Code Online (Sandbox Code Playgroud)
我的问题是:在第二个函数表达式声明中,"bar"的重点是什么?一般来说,为什么要使用命名函数表达式?
我正在学习JavaScript,我觉得我理解提升得体,所以我不会问它是什么,或者怎么做,或类似的东西.
提升是否好?如果可以,我应该使用声明我的变量
var foo = function() {};
Run Code Online (Sandbox Code Playgroud)
或者我应该使用它吗?
function foo() {}
Run Code Online (Sandbox Code Playgroud)
我什么时候应该提升,什么时候不应该?或者它甚至是否重要?
我试图弄清楚它是如何工作的.当我引用一个尚未声明的命名Javascript函数时,在某些情况下,它可以工作.但是,如果我使用函数文字,它不会,但它也不会失败ReferenceError.
function works() {
var works_ref = foo;
function foo() {
console.log('ok');
};
console.log('works ' + works_ref);
}
function fails() {
var fails_ref = foo;
var foo = function() {
console.log('ok');
};
console.log('fails ' + fails_ref);
}
works();
fails();
Run Code Online (Sandbox Code Playgroud)
这回来了
"works function foo() {
console.log('ok');
}"
"fails undefined"
Run Code Online (Sandbox Code Playgroud)
我想知道第一个例子是如何工作的 - 这是一个解释语言,没有编译,所以我希望任何类型的前向引用都会失败 - 为什么第二个例子不能生成ReferenceError?
为什么没有为函数创建引用f
if ( function f() { } ) {
console.log( typeof f );
}
// result: undefined Run Code Online (Sandbox Code Playgroud)
而分配/设置变量正常工作内if( )
if ( f = 'assigned' ) {
console.log( typeof f );
}
// result: stringRun Code Online (Sandbox Code Playgroud)
我需要知道在第一种情况下会发生什么,因为第二种情况正如预期的那样工作
有人可以解释一下吗?