我是JavaScript新手,我正在按照教程试验全局范围。
在本教程中,我有3个文件:
1) index.htm :
<html>
<head></head>
<body>
<h1>HELLO WORLD !!!</h1>
<script src="app.js"></script>
<script src="utility.js"></script>
</body>
</html>
如您所见,我包含2个JavaScript文件。
2) app.js :
var person = 'Torny'; // When I call the logPerson() function this line override the person variable value into the global stack
//console.log(person);
logPerson();
3) utility.js ,其中定义了 app.js 文件中定义的 logPerson()函数:
var person = 'Steve';
function logPerson() {
console.log(person);
}
好的,所以我期待以下行为:
在 app.js 文件中设置字符串&#39; Tony&#39;作为 person 变量的值,将 logPerson()函数调用到 utility.js 文件中,因此打印&#39; Tony& #39;在控制台中。
问题在于,当我尝试将 index.htm 文件打开到FireFox中时,我会进入FireBug控制台,而不是“Tony&#39;值我收到此错误消息:
ReferenceError: logPerson is not defined
因此,似乎从 app.js 文件中,它无法看到 utility.js中定义的 logPerson()函数文件并导入。
为什么呢?我错过了什么?怎么了?
答案 0 :(得分:9)
在javascript中,文件的顺序很重要。您需要先加载定义函数的脚本,然后才能使用它。切换2 <script>
代码
<body>
<h1>HELLO WORLD !!!</h1>
<script src="utility.js"></script>
<script src="app.js"></script>
</body>
</html>
答案 1 :(得分:3)
变化
<script src="app.js"></script>
<script src="utility.js"></script>
到
<script src="utility.js"></script>
<script src="app.js"></script>
;)您尝试从稍后加载的脚本中获取定义 问候
答案 2 :(得分:3)
第一个浏览器将解析JS文件。
如果您看到包含脚本的顺序
所以当它解析app.js.它看到logPerson()
这是函数调用而不是函数定义。此时,文件utility.js未被解析,浏览器也不知道该函数。 (意思是直到它读取utility.js)。
所以要解决这个问题,请在dom-loaded,usiing body onload
函数之后调用logPerson api。
答案 3 :(得分:2)
解释就像Javascript代码在运行中解释一样简单:当一个脚本被加载时,它会立即执行。
因此,您只需按正确的依赖顺序声明脚本。
答案 4 :(得分:2)
在运行定义logPerson
的脚本之前,您运行尝试使用logPerson
的脚本。
如果您颠倒脚本的顺序,它将起作用。
函数声明提升仅适用于给定的脚本。
答案 5 :(得分:0)
就我而言,<script>
排序不是问题(最初的想法),而是定义函数的范围。为了能够在其他JS文件中访问该函数,我将其作为 的对象的属性在这些文件的范围内。现在,只要MyObject.myFunction
被实例化,就可以MyObject
访问它。
(function ($) {
function MyObject(data) {
var myFunction = function(){
console.log('');
}
$.extend(this, {
// methods
"myFunction": myFunction,
});
}
}(jQuery));