<script type="text/javascript">
var output = function() {console.log('result')}
output();
</script>
如果我更改为output = function() {console.log('result')};
,它仍会显示正确的结果,所以我的问题是:
他们之间有什么区别?什么时候应该把var放在js中的函数前面?与变量前面的var
原理相同吗?
答案 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 here和the function operator here。
干杯!