什么时候应该把var放在js中的函数前面?

时间:2013-07-04 07:50:33

标签: javascript

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

如果我更改为output = function() {console.log('result')};,它仍会显示正确的结果,所以我的问题是:

他们之间有什么区别?什么时候应该把var放在js中的函数前面?与变量前面的var原理相同吗?

6 个答案:

答案 0 :(得分:2)

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未在本地定义,我们覆盖了全局对象。

答案 1 :(得分: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进行比较,{{1}}将其范围限制为块:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let

答案 2 :(得分:0)

“这与变量前面的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%变种)

您实际上将名为“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'

答案 3 :(得分:0)

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

答案 4 :(得分:0)

通常没有区别,因为您在全球scope,但在 ES5 中有一个strict mode,这会略微改变未声明变量的行为。在strict mode中,对未声明的标识符的分配(不在前面放置var)是一个ReferenceError。

例如:

"use strict";
myVariable = "foo"; // throws a ReferenceError

答案 5 :(得分:0)

功能与否功能,这里是what MDN has to say about var

  

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

     

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

您还可以阅读the function statement herethe function operator here

干杯!