Javascript全局变量和命名空间
Javascript global variable and namespace
我试图理解为什么一个选项卡不通过表单输入值更新。
程序由三部分组成:
- tasks10.html的形式和tasks10.js调用
- utilites10 .js将函数分组到一个对象U ={…}来创建命名空间。用于填充选项卡的函数名为plusTask。
- tasks10.js是一个立即调用的函数,目的是为'onsubmit'事件分配函数u.p ulstask
我把声明var tasks = [];In tasks10.js => failed;in plutask => failed。在这两种情况下,选项卡都没有被填充,索引仍然保持为0。
HTML<!doctype html>
<head>
<title>List</title>
<link rel="stylesheet" href="css/form.css">
</head>
<body>
<form action="#" method="post" id="theForm">
<fieldset><legend>Enter an Item To Be Done</legend>
<div><label for="task">Task</label><input type="text" name="task" id="task" required></div>
<input type="submit" value="Add It!" id="submit">
<div id="output"></div>
<p id='test'> -- </p>
</fieldset>
</form>
<script src="js/utilities10.js"></script>
<script src="js/tasks10.js"></script>
</body>
</html>
tasks10.js
(function() { // immediately invoked function
'use strict';
//window.addEventListener('onsubmit',U.plusTask,false);
U.$('theForm').onsubmit = U.plusTask;
})(); // End of anonymous function.
utilities10.js
var U = {
// For getting the document element by ID:
$: function(id) {
'use strict';
if (typeof id == 'string') {
//alert("cxcwcw $"+ id);
return document.getElementById(id);
}
}, // End of $() function.
plusTask : function() {
var tasks = [];
// Function called when the form is submitted.
// Function adds a task to the global array.
function innerCalculate(){
alert(tasks.length);
'use strict';
// Get the task:
//var task =this.$('task');
var task =U.$('task'); alert("task : " + task);
//var task =document.getElementById('task');
// Reference to where the output goes:
//var output = this.$('output');
var output = U.$('output');
//var output = document.getElementById('output');
alert("in");
// For the output:
var message = '';
if (task.value) {
U.$('test').innerHTML = tasks.length;
//document.getElementById('test').innerHTML = tasks.length;
// Add the item to the array:
tasks.push(task.value);
// Update the page:
message = '<h2>To-Do</h2><ol>';
for (var i = 0, count = tasks.length; i < count; i++) {
message += '<li>' + this.tasks[i] + ' - ' + count + '</li>';
}
message += '</ol>';
output.innerHTML = message;
} // End of task.value IF.
// Return false to prevent subssmission:
return false;
} // End of innerCalculate
innerCalculate();
} // End of plusTask function
} // End of U
plusTask
函数每次被调用时都会重置所有的局部变量。
我认为你的意思是使用生命来创建闭包。同时,this.tasks[i]
应为tasks[i]
。
plusTask : (function() { // IIFE
var tasks = [];
function innerCalculate() {
alert(tasks.length);
'use strict';
var task = U.$('task');
alert("task : " + task);
var output = U.$('output');
alert("in");
var message = '';
if (task.value) {
U.$('test').innerHTML = tasks.length;
tasks.push(task.value);
message = '<h2>To-Do</h2><ol>';
for (var i = 0, count = tasks.length; i < count; i++) {
message += '<li>' + tasks[i] + ' - ' + count + '</li>';
}
message += '</ol>';
output.innerHTML = message;
}
return false;
}
return innerCalculate; // return closure
})() // invoke plusTask IIFE
第44行:
message += '<li>' + this.tasks[i] + ' - ' + count + '</li>';
但是您想要的任务是闭包中的任务,而"this"是窗口。所以你要改成:
message += '<li>' + tasks[i] + ' - ' + count + '</li>';
另外,如果你在这里按下submit,它会重新加载页面。所以plusTask应该像这样开始:
plusTask : function(event) {
event.preventDefault();
...
本姆,卡塞尔,干得好!我应该考虑结束,而没有使用这个。最终的js代码完成了这项工作。谢谢你们两位。:
<pre>
plusTask : (function(e) { // IIFE
var tasks = [];
function innerCalculate(e) {
if(typeof e == 'undefined') e = window.event;
alert(tasks.length);
'use strict';
var task = U.$('task');
alert("task : " + task);
var output = U.$('output');
alert("in");
var message = '';
if (task.value) {
U.$('test').innerHTML = tasks.length;
tasks.push(task.value);
message = '<h2>To-Do</h2><ol>';
for (var i = 0, count = tasks.length; i < count; i++) {
message += '<li>' + tasks[i] + ' - ' + count + '</li>';
}
message += '</ol>';
output.innerHTML = message;
}
// Return false to prevent submission:
if (e.preventDefault) {
e.preventDefault();
} else {
e.returnValue = false;
}
return false;
}
return innerCalculate; // return closure
})() // invoke plusTask IIFE
</pre>
相关文章:
- js命名空间和变量范围
- 如何为HTML属性/选择器创建全局名称空间或变量
- 在Firebug控制台中监视javascript命名空间变量
- 用自定义javascript全局命名空间替换窗口
- 从html文件中的脚本标记调用非全局命名空间函数
- 正在测量全局命名空间的污染
- 带有 jquery、全局命名空间的变量的 $ 前缀
- jQuery 函数的全局命名空间问题
- 检查全局命名空间中是否存在没有备用名称的变量
- 为什么Google闭包编译器在原始命名空间为空的情况下向全局命名空间添加变量
- 命名空间和全局变量
- 全局命名空间变量
- javascript匿名函数:这个变量是如何在全局命名空间中公开的
- Javascript命名空间:本地变量已更新,但不是公共变量
- 在javascript d3.js中使用命名空间时,全局变量未更新
- 自调用函数javascript清理全局命名空间上的变量
- Javascript全局变量和命名空间
- 一个全局命名空间中的所有窗口变量
- JavaScript—自调用的匿名函数是否能够充分保护变量免受全局命名空间的影响?
- 访问命名空间中的全局变量