0
<script type="text/javascript"> 
var output = function() {console.log('result')}
output();
</script>  

If I changed to output = function() {console.log('result')}; it still shows the right result, so my question is:

what is the difference between them? when should I put var in front of function in js? is that the same principle as var in front of variable?

4

6 回答 6

3

在标签中定义的函数在script全局范围内(即window浏览器上下文中的对象),因此在这种情况下没有区别。

然而,在功能块内部是另一回事。例如:

foo = function() {
    var foo = 1;
    console.log(foo);
}
foo();  // logs '1'
foo();  // logs '1'

但:

foo = function() {
    foo = 1;
    console.log(foo);
}
foo();  // logs '1'
foo();  // SyntaxError: Unexpected token function

因为foo没有在本地定义,我们覆盖了全局对象。

于 2013-07-04T07:57:17.950 回答
1

你在全球window范围内,所以没有区别。

变量的类型无关紧要。

如果这是在函数中声明的,那么就有区别:

function name(){
    var a=1;
}
alert(a);

这里a将是未定义的,因为var在函数范围内声明了变量。

作为练习:

var a=2;
function name(){
    var a=1;
}
name();
alert(a);

这会提醒2而不是1,因为中间var属于函数的范围,与全局范围是分开的。

你也可以这样修改全局变量:

var a=2;
function name(){
    a=3;
}
name();
alert(a);

还将其与 比较let,这将其范围限制为块:https ://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

于 2013-07-04T07:51:44.170 回答
0

函数与否,以下是 MDN 对 var的评价:

用 var 声明的变量的范围是封闭函数,或者,对于在函数外部声明的变量,全局范围(绑定到全局对象)。

在函数外使用 var 是可选的;为未声明的变量赋值隐含地将其声明为全局变量(它现在是全局对象的属性)。不同之处在于声明的变量是全局对象的不可配置属性,而未声明的变量是可配置的。

您还可以在此处阅读有关函数语句函数运算符的信息

干杯!

于 2013-07-04T08:23:09.080 回答
0

“这和var前面的var是一样的原理吗?”

是的。输出一个变量。

所以我建议你在定义var它的时候在它前面使用。您最终可以在不使用 var 的情况下更改其值。如:

var A=1;
A=2;
A=A+1;

将函数的“脚本”视为该变量的“值”。

var F=function() {console.log('one')};
// change it later
F=function() {console.log('two')};

(不建议你这样做,而是向你展示它是 100% 的 var)

您实际上是在为名为“output”的变量分配“function() {console.log('result')}”的值,而不是作为字符串,而是作为执行的脚本。注意末尾的分号,如var A=3;

现在“里面”output有执行的代码console.log('result')。(或多或少,只是为了解释)。

因为您通常以后不会更改相同的功能(您可以,有时它已经完成)我真的建议您在每次var定义这样的功能时在它前面使用,即使在不是严格必要的情况下,只是为了安全起见,不要覆盖现有功能。

这与将函数定义为:

function output() {console.log('result')}

这里没有 = 符号,没有赋值,末尾没有分号。这不是变量赋值,而是函数“定义”,虽然结果相似,而且两种情况下都可以调用 output(),但还是有区别的。我认为主要的一个是在逐行执行脚本之前检查函数定义,而对于赋值,你确实需要在使用函数之前处理赋值行。所以这:

output();

function output() {console.log('result')}

作品。虽然这样:

output(); // nope! output not defined yet!

var output=function() {console.log('result')}

没有。当赋值指令被读取和解释时,变量被赋值或改变。

// here A is undefined, B() prints 'ok'

var A=function() {console.log('first')};

// here A() prints 'first', B() prints 'ok' as usual

 A=function() {console.log('second')}; // change it

// here A() prints 'second', B() prints 'ok' as usual

function B() {console.log('ok')}

// same here A() prints 'second', B() prints 'ok'
于 2013-07-04T07:55:46.003 回答
0

没有var您的变量将被声明为全局变量,这意味着它也可用于其他JS文件。简而言之,如果您声明一个变量,而不使用var,则该变量始终变为 GLOBAL。

于 2013-07-04T07:56:45.683 回答
0

通常没有区别,因为您在 globalscope中,但在ES5中有 a strict mode,它会稍微改变未声明变量的行为。在strict mode中,分配给未声明的标识符(不是放在var前面)是一个 ReferenceError。

例如:

"use strict";
myVariable = "foo"; // throws a ReferenceError
于 2013-07-04T07:57:46.210 回答