我正在审查函数与全局范围中的变量可访问性,并遇到了一些新内容,并想知道以下内容是否正确:
function foo (){
message='Hi'
}
alert(message); //ReferenceError: message is not defined
这会返回一个错误,因为foo
尚未在任何地方调用,但是一旦执行,它就可以在全局空间中使用。明白了。
然而,除了显式地使函数返回一个值(即使用return关键字)之外,我在某处读到了它们,我们将它们用于它们的副作用(例如,想象一下我将该警报函数放在我刚引用的foo中)。
以上是否以某种方式返回值与使用return
关键字时的方式相同?
更新 我收到了很多反馈,但也许我应该重申一下这个问题。 仅仅是调用函数将其置于全局范围内的事实。 就像幕后发生的一样......?我认为有些人可能会认为(就像我一样)只是省略var,它就在全球范围内。实际上,对于那些不知道的人,你必须先调用该函数。 谢谢!
答案 0 :(得分:5)
以上是以某种方式返回值的方式与使用return关键字时的方式相同吗?
没有。通过分配给未在任何地方声明的变量,它依赖于Horror of Implicit Globals。当您这样做时,在松散模式下,它会创建一个全局变量。它与从函数返回值无关,而且你应该做的事情没什么 - 事实上,这是使用严格模式和/或像JSHint这样的“lint”工具的更好理由之一,因此无意中的全局变为你可以找到并修复的错误。
要从函数返回值,您:
在函数中使用return
来说明返回的内容以及何时返回,例如:
function myFunction() {
return "foo";
}
调用时使用函数的结果,例如:
var variable = myFunction();
// or
anotherFunction(myFunction());
// etc.
在松散模式和严格模式下分配未声明变量的差异示例:
function runLoose() {
// In loose mode
try {
looseFoo = "bar";
snippet.log(looseFoo); // "bar"
}
catch (e) {
snippet.log("Got exception: " + e.message);
}
}
function runStrict() {
"use strict";
// In strict mode
try {
strictFoo = "bar"; // <== Causes ReferenceError
snippet.log(strictFoo);
}
catch (e) {
snippet.log("Got exception: " + e.message);
}
}
runLoose();
runStrict();
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
答案 1 :(得分:1)
不,没有任何回复。
如果先调用foo,则定义消息,因为声明没有var的变量在范围内是全局的。
如果你添加var它不再具有全局范围,你会得到同样的错误。
function foo (){
var message='Hi'
}
foo();
alert(message); //ReferenceError: message is not defined
答案 2 :(得分:1)
答案是否定的......
您可以通过称为闭包的内容访问父作用域中的变量。
function a () {
var aValue = 1;
console.log(aValue); // 1
function b () {
aValue += 1;
}
console.log(aValue); // 1
b();
console.log(aValue); // 2
}
这是有效的,因为当您定义一个函数(源代码实际写入文件的位置)时,该函数会引用其父级范围内的所有变量(及其父级&#) 39;等等,最多window
)。
window
本身就是一个特殊情况函数。
将其想象为b。 secretTable .parent。 secretTable .aVar + = 1;
...当你的.parent
元素用尽时,你遇到了一个引用错误,你仍然没有在任何地方找到变量名称。
依赖范围表在window
上设置未声明的变量(如果将值设置为变量,它会爬上该范围链,直到找到声明var的范围,或者它运行.parent
元素...... window
,然后将值设置在那里)大概是最糟糕的事情。
......依靠封闭引用,一般来说,以受控方式很棒。
依赖严密的闭包引用(构建thunk / currying函数/等等)对于看起来不像Java的JavaScript来说是关键。
答案 3 :(得分:-1)
它没有返回任何东西。它只是改变了全球&#34;的价值。变量
var test = 0; // global scope
function foo() {
var localVar = 'bar'; // local to function
test = 1; // accessing/modifying global "test" var
}
foo();
alert(test); // alerts "1"
alert(localVar); // ReferenceError: localVar is not defined
要将其分解,第一个变量test
是在全局范围内创建的。它在foo()
函数内访问并更改。调用所述函数后,该变量上的alert()
输出函数中设置的值。 (不需要返回,因为它是全局的)。
另一方面,localVar
在函数内创建,因此警告它会产生ReferenceError
,这是因为该变量仅存在于函数中。
可以在jsFiddle中复制确切的结果。