在全局范围内分配`var location`会重定向到不存在的文件

时间:2017-09-04 01:41:30

标签: javascript window.location

我有一个HTML文件test.html,其中我有两个名为location的变量,一个全局变量和一个本地变量。但是,当我在浏览器中打开它时,它只是显示Your file was not found,地址栏显示file://Los%20Angeles而非预期的file://test.html。为什么呢?

<html>
<body>
<script type="text/javascript">
var location = "Los Angeles"
function showLocation() {
    var location = "San Francisco"
    document.write(location)
}
</script>
<input type="button" onclick="showLocation()" value="Show Location"/>
</body>
</html>

2 个答案:

答案 0 :(得分:2)

&#39;位置&#39;是javascript中的保留关键字。只需将变量名称更改为其他名称即可。 有关保留字的更多信息:https://www.w3schools.com/js/js_reserved.asp

答案 1 :(得分:2)

设置全局location会导致浏览器转到该网址。它不是保留字 - 它是在窗口对象上定义的变量。这是一个更好的保留字列表:

https://docs.microsoft.com/en-us/scripting/javascript/reference/javascript-reserved-words

在您的示例中,您将全局location设置为“洛杉矶”,这会导致窗口导航到该窗口,就像它是相对URL一样。

在函数内设置var location = "San Francisco"对窗口对象没有影响,因为函数变量有自己的作用域。

所以你可以这样做:

function showLocation() {
    var location = "San Francisco"
    document.write(location)
}

它将按预期工作。它会将字符串'San Francisco'写入文档。

如果您使用的是现代浏览器,可以尝试使用'let'设置'location'来查看正在发生的事情:

let location = "los angeles"

现在您将收到类似以下内容的错误:

  

SyntaxError:无法创建隐藏全局属性的重复变量:'location'